This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] BZ#13691: Fix a bug when converting strings with 1character using TCVN5712-1
On Fri, Mar 30, 2012 at 02:12:59PM +0200, Andreas Jaeger wrote:
> On 03/28/2012 08:41 PM, Tulio Magno Quites Machado Filho wrote:
> >It isn't necessary to buffer the last character of strings. This can cause a
> >bug with strings that have 1 character between 0x0041 and 0x01b0.
>
> Tulio,
>
> This fails the testsuite, iconvdata/iconv-test.out has now:
>
> test data: TCVN-5712 -> UTF8 OK/FAILED
>
> could you look into this, please?
Sure.
> Andreas
>
> >2012-03-26 Tulio Magno Quites Machado Filho<tuliom@linux.vnet.ibm.com>
> >
> > [BZ #13691]
> > * iconvdata/tcvn5712-1.c (FROM_LOOP): Fix a bug when converting strings
> > with only 1 character between 0x0041 and 0x01b0.
> > * wcsmbs/Makefile (tests): Add tst-mbsnrtowcs.
> > * wcsmbs/tst-mbsnrtowcs.c: New file.
> >---
> > iconvdata/tcvn5712-1.c | 4 +-
> > wcsmbs/Makefile | 3 +-
> > wcsmbs/tst-mbsnrtowcs.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++
> > 3 files changed, 87 insertions(+), 3 deletions(-)
> > create mode 100644 wcsmbs/tst-mbsnrtowcs.c
> >
> >diff --git a/iconvdata/tcvn5712-1.c b/iconvdata/tcvn5712-1.c
> >index 49d5430..09dcbbf 100644
> >--- a/iconvdata/tcvn5712-1.c
> >+++ b/iconvdata/tcvn5712-1.c
> >@@ -1,5 +1,5 @@
> > /* Conversion to and from TCVN5712-1.
> >- Copyright (C) 2001, 2002, 2004, 2011 Free Software Foundation, Inc.
> >+ Copyright (C) 2001-2012 Free Software Foundation, Inc.
> > This file is part of the GNU C Library.
> > Contributed by Ulrich Drepper<drepper@redhat.com>, 2001.
> >
> >@@ -379,7 +379,7 @@ static const struct
> > last_ch = *statep>> 3; \
> > \
> > /* We have to buffer ch if it is a possible match in comp_table_data. */ \
> >- must_buffer_ch = (ch>= 0x0041&& ch<= 0x01b0); \
> >+ must_buffer_ch = last_ch&& (ch>= 0x0041&& ch<= 0x01b0); \
> > \
> > if (last_ch) \
> > { \
> >diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
> >index fc67be8..c4d31d9 100644
> >--- a/wcsmbs/Makefile
> >+++ b/wcsmbs/Makefile
> >@@ -44,7 +44,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
> > strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy
> > tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
> > tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \
> >- tst-c16c32-1 \
> >+ tst-c16c32-1 tst-mbsnrtowcs \
> > wcsatcliff $(addprefix test-,$(strop-tests))
> >
> > include ../Rules
> >@@ -85,3 +85,4 @@ tst-mbrtowc-ENV = LOCPATH=$(common-objpfx)localedata
> > tst-wcrtomb-ENV = LOCPATH=$(common-objpfx)localedata
> > tst-mbrtowc2-ENV = LOCPATH=$(common-objpfx)localedata
> > tst-c16c32-1-ENV = LOCPATH=$(common-objpfx)localedata
> >+tst-mbsnrtowcs-ENV = LOCPATH=$(common-objpfx)localedata
> >diff --git a/wcsmbs/tst-mbsnrtowcs.c b/wcsmbs/tst-mbsnrtowcs.c
> >new file mode 100644
> >index 0000000..29ff7c2
> >--- /dev/null
> >+++ b/wcsmbs/tst-mbsnrtowcs.c
> >@@ -0,0 +1,83 @@
> >+/* Copyright (C) 2012 Free Software Foundation, Inc.
> >+ This file is part of the GNU C Library.
> >+ Contributed by Tulio Magno Quites Machado Filho<tuliom@linux.vnet.ibm.com>,
> >+ 2012.
> >+
> >+ The GNU C Library is free software; you can redistribute it and/or
> >+ modify it under the terms of the GNU Lesser General Public
> >+ License as published by the Free Software Foundation; either
> >+ version 2.1 of the License, or (at your option) any later version.
> >+
> >+ The GNU C Library is distributed in the hope that it will be useful,
> >+ but WITHOUT ANY WARRANTY; without even the implied warranty of
> >+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> >+ Lesser General Public License for more details.
> >+
> >+ You should have received a copy of the GNU Lesser General Public
> >+ License along with the GNU C Library; if not, see
> >+<http://www.gnu.org/licenses/>. */
> >+
> >+/* Test bugzilla 13691 */
> >+
> >+#include<stdio.h>
> >+#include<string.h>
> >+#include<wchar.h>
> >+#include<locale.h>
> >+
> >+static int
> >+do_test (void)
> >+{
> >+ const char * in = "A";
> >+ const char *inbuf = in;
> >+ size_t inlen = strchr (in, '\0') - inbuf;
> >+
> >+ wchar_t out[5];
> >+ mbstate_t ps;
> >+
> >+ const char *locale = "vi_VN.TCVN5712-1";
> >+ if (!setlocale (LC_ALL, locale))
> >+ {
> >+ printf ("Locale not available.\n");
> >+ return 1;
> >+ }
> >+
> >+ memset (&ps, '\0', sizeof (ps));
> >+ memset (out, '\0', sizeof (out));
> >+
> >+ /* If the bug isn't fixed, it isn't going to return from mbsnrtowcs due to
> >+ an assert(). */
> >+ size_t n = mbsnrtowcs (out,&inbuf, inlen, sizeof(out) - 1,&ps);
> >+
> >+ int result = 0;
> >+
> >+ if (n != 1)
> >+ {
> >+ printf ("n = %zu, expected 1\n", n);
> >+ result = 1;
> >+ }
> >+
> >+ int i;
> >+ printf ("in = ");
> >+ for (i = 0; i< inlen; i++)
> >+ {
> >+ printf ("0x%X ", in[i]);
> >+ }
> >+ printf ("\n");
> >+
> >+ char * outb = (char *) out;
> >+ printf ("out =");
> >+ for (i = 0; i< sizeof (out); i++)
> >+ {
> >+ if (i % 4 == 0)
> >+ {
> >+ printf (" 0x");
> >+ }
> >+ printf ("%X", outb[i]);
> >+ }
> >+ printf ("\n");
> >+
> >+ return result;
> >+}
> >+
> >+#define TEST_FUNCTION do_test ()
> >+#include "../test-skeleton.c"
>
>
> --
> Andreas Jaeger aj@{suse.com,opensuse.org} Twitter/Identica: jaegerandi
> SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
> GF: Jeff Hawn,Jennifer Guild,Felix Imendörffer,HRB16746 (AG Nürnberg)
> GPG fingerprint = 93A3 365E CE47 B889 DF7F FED1 389A 563C C272 A126
>
--
Tulio Magno