changeset 33203:29d877b8dbab

iconv: Work around AIX 6.1..7.1 bug.
author Bruno Haible <bruno@clisp.org>
date Sat, 31 Jul 2010 13:33:32 +0200
parents 4a74be5d78df
children 799a6ae9adce
files ChangeLog doc/posix-functions/iconv.texi m4/iconv.m4
diffstat 3 files changed, 34 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sat Jul 31 12:23:44 2010 +0200
+++ b/ChangeLog	Sat Jul 31 13:33:32 2010 +0200
@@ -1,3 +1,11 @@
+2010-07-31  Bruno Haible  <bruno@clisp.org>
+
+	iconv: Work around AIX 6.1..7.1 bug.
+	* doc/posix-functions/iconv.texi: Mention AIX 6.1, 7.1 bug.
+	* m4/iconv.m4 (AM_ICONV_LINK): Test against AIX 6.1, 7.1 bug. When
+	cross-compiling, guess no on all versions of AIX.
+	Reported by Rainer Tammer.
+
 2010-07-31  Bruno Haible  <bruno@clisp.org>
 
 	readlink: Relax test a bit.
--- a/doc/posix-functions/iconv.texi	Sat Jul 31 12:23:44 2010 +0200
+++ b/doc/posix-functions/iconv.texi	Sat Jul 31 13:33:32 2010 +0200
@@ -13,6 +13,9 @@
 @item
 Failures are not distinguishable from successful returns on some platforms:
 AIX 5.1, Solaris 10.
+@item
+A buffer overrun can occur on some platforms:
+AIX 6.1..7.1.
 @end itemize
 
 Portability problems not fixed by Gnulib:
--- a/m4/iconv.m4	Sat Jul 31 12:23:44 2010 +0200
+++ b/m4/iconv.m4	Sat Jul 31 13:33:32 2010 +0200
@@ -1,4 +1,4 @@
-# iconv.m4 serial 11a
+# iconv.m4 serial 11b
 dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -58,7 +58,8 @@
   ])
   if test "$am_cv_func_iconv" = yes; then
     AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
-      dnl This tests against bugs in AIX 5.1, HP-UX 11.11, Solaris 10.
+      dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
+      dnl Solaris 10.
       am_save_LIBS="$LIBS"
       if test $am_cv_lib_iconv = yes; then
         LIBS="$LIBS $LIBICONV"
@@ -106,6 +107,24 @@
           return 1;
       }
   }
+  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static const char input[] = "\304";
+        static char buf[2] = { (char)0xDE, (char)0xAD };
+        const char *inptr = input;
+        size_t inbytesleft = 1;
+        char *outptr = buf;
+        size_t outbytesleft = 1;
+        size_t res = iconv (cd_88591_to_utf8,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+          return 1;
+      }
+  }
 #if 0 /* This bug could be worked around by the caller.  */
   /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
   {
@@ -142,8 +161,8 @@
         [
 changequote(,)dnl
          case "$host_os" in
-           aix | aix[3-6]* | hpux*) am_cv_func_iconv_works="guessing no" ;;
-           *)                       am_cv_func_iconv_works="guessing yes" ;;
+           aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+           *)            am_cv_func_iconv_works="guessing yes" ;;
          esac
 changequote([,])dnl
         ])