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>
|
2012-03-29 David S. Miller <davem@davemloft.net>
|
||||||
|
|
||||||
* libio/fileops.c (_IO_new_file_xsputn): Don't try to optimize
|
* 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,
|
10110, 10135, 10140, 10210, 10545, 10716, 11174, 11322, 11365, 11451,
|
||||||
11494, 12047, 13058, 13525, 13526, 13527, 13528, 13529, 13530, 13531,
|
11494, 12047, 13058, 13525, 13526, 13527, 13528, 13529, 13530, 13531,
|
||||||
13532, 13533, 13547, 13551, 13552, 13553, 13555, 13559, 13566, 13583,
|
13532, 13533, 13547, 13551, 13552, 13553, 13555, 13559, 13566, 13583,
|
||||||
13618, 13637, 13656, 13658, 13673, 13695, 13704, 13706, 13726, 13738,
|
13618, 13637, 13656, 13658, 13673, 13691, 13695, 13704, 13706, 13726,
|
||||||
13760, 13761, 13786, 13792, 13806, 13824, 13840, 13841, 13844, 13846,
|
13738, 13760, 13761, 13786, 13792, 13806, 13824, 13840, 13841, 13844,
|
||||||
13851, 13852, 13854, 13871, 13879, 13883, 13892, 13910, 13911, 13912,
|
13846, 13851, 13852, 13854, 13871, 13879, 13883, 13892, 13910, 13911,
|
||||||
13913, 13915, 13916, 13917, 13918, 13919, 13920, 13921
|
13912, 13913, 13915, 13916, 13917, 13918, 13919, 13920, 13921
|
||||||
|
|
||||||
* ISO C11 support:
|
* ISO C11 support:
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Conversion to and from TCVN5712-1.
|
/* 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.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
|
||||||
|
|
||||||
@ -379,7 +379,7 @@ static const struct
|
|||||||
last_ch = *statep >> 3; \
|
last_ch = *statep >> 3; \
|
||||||
\
|
\
|
||||||
/* We have to buffer ch if it is a possible match in comp_table_data. */ \
|
/* 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) \
|
if (last_ch) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -44,7 +44,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
|
|||||||
strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy
|
strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy
|
||||||
tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
|
tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
|
||||||
tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \
|
tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \
|
||||||
tst-c16c32-1 \
|
tst-c16c32-1 tst-mbsnrtowcs \
|
||||||
wcsatcliff $(addprefix test-,$(strop-tests))
|
wcsatcliff $(addprefix test-,$(strop-tests))
|
||||||
|
|
||||||
include ../Rules
|
include ../Rules
|
||||||
@ -85,3 +85,4 @@ tst-mbrtowc-ENV = LOCPATH=$(common-objpfx)localedata
|
|||||||
tst-wcrtomb-ENV = LOCPATH=$(common-objpfx)localedata
|
tst-wcrtomb-ENV = LOCPATH=$(common-objpfx)localedata
|
||||||
tst-mbrtowc2-ENV = LOCPATH=$(common-objpfx)localedata
|
tst-mbrtowc2-ENV = LOCPATH=$(common-objpfx)localedata
|
||||||
tst-c16c32-1-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