This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] BZ#13691: Fix a bug when converting strings with 1 character using TCVN5712-1
- From: Tulio Magno Quites Machado Filho <tuliom at linux dot vnet dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Cc: polacek at redhat dot com, roland at hack dot frob dot com, aj at suse dot com
- Date: Wed, 28 Mar 2012 15:41:11 -0300
- Subject: [PATCH] BZ#13691: Fix a bug when converting strings with 1 character using TCVN5712-1
- References: <20120306194207.9E7782C0AC@topped-with-meat.com>
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.
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"
--
1.7.4.4