Fix a bug when converting strings with 1 character using TCVN5712-1
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. [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.
This commit is contained in:
parent
20fde22738
commit
e64d2de526
@ -1,3 +1,11 @@
|
||||
2012-03-30 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.
|
||||
|
||||
2012-03-29 David S. Miller <davem@davemloft.net>
|
||||
|
||||
* libio/fileops.c (_IO_new_file_xsputn): Don't try to optimize
|
||||
|
8
NEWS
8
NEWS
@ -15,10 +15,10 @@ Version 2.16
|
||||
10110, 10135, 10140, 10210, 10545, 10716, 11174, 11322, 11365, 11451,
|
||||
11494, 12047, 13058, 13525, 13526, 13527, 13528, 13529, 13530, 13531,
|
||||
13532, 13533, 13547, 13551, 13552, 13553, 13555, 13559, 13566, 13583,
|
||||
13618, 13637, 13656, 13658, 13673, 13695, 13704, 13706, 13726, 13738,
|
||||
13760, 13761, 13786, 13792, 13806, 13824, 13840, 13841, 13844, 13846,
|
||||
13851, 13852, 13854, 13871, 13879, 13883, 13892, 13910, 13911, 13912,
|
||||
13913, 13915, 13916, 13917, 13918, 13919, 13920, 13921
|
||||
13618, 13637, 13656, 13658, 13673, 13691, 13695, 13704, 13706, 13726,
|
||||
13738, 13760, 13761, 13786, 13792, 13806, 13824, 13840, 13841, 13844,
|
||||
13846, 13851, 13852, 13854, 13871, 13879, 13883, 13892, 13910, 13911,
|
||||
13912, 13913, 13915, 13916, 13917, 13918, 13919, 13920, 13921
|
||||
|
||||
* ISO C11 support:
|
||||
|
||||
|
@ -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) \
|
||||
{ \
|
||||
|
@ -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
|
||||
|
83
wcsmbs/tst-mbsnrtowcs.c
Normal file
83
wcsmbs/tst-mbsnrtowcs.c
Normal file
@ -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"
|
Loading…
Reference in New Issue
Block a user