From: Bruno Haible Date: Fri, 14 Jun 2002 12:05:36 +0000 (+0000) Subject: Fix unexpected iconv() handling after an invalid multibyte sequence. X-Git-Tag: v0.11.3~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7eafed6401c05a219dd83f6b4c47166ff6259c83;p=thirdparty%2Fgettext.git Fix unexpected iconv() handling after an invalid multibyte sequence. --- diff --git a/src/ChangeLog b/src/ChangeLog index 16ca59fc9..29c4520e3 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2002-06-14 Bruno Haible + + * po-lex.c (mbfile_getc): Handle the case where iconv converts + some character and returns -1 at once; this can happen immediately + after an invalid multibyte sequence. + Reported by Andrew V. Samoilov . + 2002-06-07 Bruno Haible * user-email.in: Look at /etc/mailname, found on Debian systems. diff --git a/src/po-lex.c b/src/po-lex.c index 7308ed93f..adcb398a3 100644 --- a/src/po-lex.c +++ b/src/po-lex.c @@ -496,15 +496,17 @@ mbfile_getc (mbc, mbf) char *outptr = &scratchbuf[0]; size_t outsize = sizeof (scratchbuf); - if (iconv (po_lex_iconv, - (ICONV_CONST char **) &inptr, &insize, - &outptr, &outsize) - == (size_t)(-1)) + size_t res = iconv (po_lex_iconv, + (ICONV_CONST char **) &inptr, &insize, + &outptr, &outsize); + /* We expect that a character has been produced if and only if + some input bytes have been consumed. */ + if ((insize < mbf->bufcount) != (outsize < sizeof (scratchbuf))) + abort (); + if (outsize == sizeof (scratchbuf)) { - /* We expect that no character has been produced. */ - if (insize < mbf->bufcount) - abort (); - if (outsize < sizeof (scratchbuf)) + /* No character has been produced. Must be an error. */ + if (res != (size_t)(-1)) abort (); if (errno == EILSEQ) diff --git a/tests/ChangeLog b/tests/ChangeLog index e463a2f05..001402f76 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,8 @@ +2002-06-14 Bruno Haible + + * msgfmt-11: New file. + * Makefile.am (TESTS): Add it. + 2002-05-19 Bruno Haible * rpath.README: Renamed from rpath-2.README. diff --git a/tests/Makefile.am b/tests/Makefile.am index 1f939ad82..65bd5fc00 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -34,7 +34,7 @@ TESTS = gettext-1 gettext-2 \ msgexec-1 msgexec-2 \ msgfilter-1 msgfilter-2 \ msgfmt-1 msgfmt-2 msgfmt-3 msgfmt-4 msgfmt-5 msgfmt-6 msgfmt-7 \ - msgfmt-8 msgfmt-9 msgfmt-10 \ + msgfmt-8 msgfmt-9 msgfmt-10 msgfmt-11 \ msggrep-1 msggrep-2 msggrep-3 msggrep-4 msggrep-5 \ msgmerge-1 msgmerge-2 msgmerge-3 msgmerge-4 msgmerge-5 msgmerge-6 \ msgmerge-7 msgmerge-8 msgmerge-9 msgmerge-10 msgmerge-11 msgmerge-12 \ diff --git a/tests/msgfmt-11 b/tests/msgfmt-11 new file mode 100755 index 000000000..daf90d098 --- /dev/null +++ b/tests/msgfmt-11 @@ -0,0 +1,36 @@ +#! /bin/sh + +# Test handling of invalid multibyte sequences. + +tmpfiles="" +trap 'rm -fr $tmpfiles' 1 2 3 15 + +tmpfiles="$tmpfiles mf-11.po" +cat <<\EOF > mf-11.po +msgid "" +msgstr "" +"Project-Id-Version: control-center 1.0.6\n" +"POT-Creation-Date: 2002-06-02 17:13-0700\n" +"PO-Revision-Date: 2002-05-29 20:11+0200\n" +"Last-Translator: Yuriy Syrota \n" +"Language-Team: Ukrainian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "_Enable keyboard accessibility" +msgstr "_õצÍËÎÕÔÉ ÓÐÅæÁÌØÎ¦ ÍÏÖÌÉ×ÏÓÔ¦ ËÌÁצÁÔÕÒÉ" +EOF + +tmpfiles="$tmpfiles mf-11.mo core *.core" +: ${MSGFMT=msgfmt} +${MSGFMT} --check -o mf-11.mo mf-11.po 2>/dev/null +# Exit code must be 1. +# If the division by zero didn't get noticed, it would be 0. +# If it produced a core dump, it would be 134 (= 128 + SIGABRT). +test $? = 1 +result=$? + +rm -fr $tmpfiles + +exit $result