]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Fix unexpected iconv() handling after an invalid multibyte sequence.
authorBruno Haible <bruno@clisp.org>
Fri, 14 Jun 2002 12:05:36 +0000 (12:05 +0000)
committerBruno Haible <bruno@clisp.org>
Tue, 23 Jun 2009 10:08:36 +0000 (12:08 +0200)
src/ChangeLog
src/po-lex.c
tests/ChangeLog
tests/Makefile.am
tests/msgfmt-11 [new file with mode: 0755]

index 16ca59fc9423f74ce321f32dd16c92eb6ad73772..29c4520e37be9fbe42f74a2c9fabd8d77a005329 100644 (file)
@@ -1,3 +1,10 @@
+2002-06-14  Bruno Haible  <bruno@clisp.org>
+
+       * 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 <kai@cmail.ru>.
+
 2002-06-07  Bruno Haible  <bruno@clisp.org>
 
        * user-email.in: Look at /etc/mailname, found on Debian systems.
index 7308ed93fb19cc19545014e30fae5404b1ca74fc..adcb398a3c92e61c97b36dcfc94fc83e4f016494 100644 (file)
@@ -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)
index e463a2f05bae9abf3084f43102d6ac26b07c28a2..001402f767b7f1cea9bf241adcacaeb432165bb9 100644 (file)
@@ -1,3 +1,8 @@
+2002-06-14  Bruno Haible  <bruno@clisp.org>
+
+       * msgfmt-11: New file.
+       * Makefile.am (TESTS): Add it.
+
 2002-05-19  Bruno Haible  <bruno@clisp.org>
 
        * rpath.README: Renamed from rpath-2.README.
index 1f939ad827db17c0fe47e929d868704ea43448ce..65bd5fc00096e649bd6a1d51a442201af1c7a9ac 100644 (file)
@@ -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 (executable)
index 0000000..daf90d0
--- /dev/null
@@ -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 <yuri@renome.rovno.ua>\n"
+"Language-Team: Ukrainian <uk@li.org>\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