From: Bruno Haible Date: Sat, 31 Jul 2010 11:33:32 +0000 (+0200) Subject: iconv: Work around AIX 6.1..7.1 bug. X-Git-Tag: v0.1~3975 X-Git-Url: http://erislabs.net/gitweb/?p=gnulib.git;a=commitdiff_plain;h=5f1cfee9e825db39e75bc2388856fb274d395e20 iconv: Work around AIX 6.1..7.1 bug. --- diff --git a/ChangeLog b/ChangeLog index edd0b8c68..1b4d2e97c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2010-07-31 Bruno Haible + 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 + readlink: Relax test a bit. * tests/test-readlink.h (test_readlink): Allow different errno value when readlink is called with a file name that ends in / and refers to diff --git a/doc/posix-functions/iconv.texi b/doc/posix-functions/iconv.texi index 5811c3dfc..adf94330e 100644 --- a/doc/posix-functions/iconv.texi +++ b/doc/posix-functions/iconv.texi @@ -13,6 +13,9 @@ GNU libiconv is not found if installed in @file{$PREFIX/lib}. @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: diff --git a/m4/iconv.m4 b/m4/iconv.m4 index f3c2ce868..2a89c606e 100644 --- a/m4/iconv.m4 +++ b/m4/iconv.m4 @@ -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 @@ AC_DEFUN([AM_ICONV_LINK], ]) 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 @@ int main () 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 @@ int main () [ 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 ])