diff options
author | Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com> | 2012-03-30 10:43:43 +0200 |
---|---|---|
committer | Andreas Jaeger <aj@suse.de> | 2012-03-30 10:43:43 +0200 |
commit | e64d2de526d8cfa2908e08892a534316a0bddf5f (patch) | |
tree | e962afa939a9c6adaf5a543b5c88215e7b27d093 /wcsmbs | |
parent | 20fde227388fb0c2857ff1793754056b833697fe (diff) | |
download | glibc-e64d2de526d8cfa2908e08892a534316a0bddf5f.tar.gz |
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.
Diffstat (limited to 'wcsmbs')
-rw-r--r-- | wcsmbs/Makefile | 3 | ||||
-rw-r--r-- | wcsmbs/tst-mbsnrtowcs.c | 83 |
2 files changed, 85 insertions, 1 deletions
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile index fc67be8f82..c4d31d9ab3 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 0000000000..29ff7c26a8 --- /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" |