This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] BZ#13691: Fix a bug when converting strings with 1 characterusing TCVN5712-1


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?
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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]