2007-08-21  Ulrich Drepper  <drepper@redhat.com>
	[BZ #4936]
	* iconv/gconv.c (__gconv): If flush was successful, clear rest of
	the state.
	* iconvdata/Makefile: Add rules to build and run bug-iconv5.
	* iconvdata/bug-iconv5.c: New file.

	[BZ #4896]
This commit is contained in:
Ulrich Drepper 2007-08-21 14:43:18 +00:00
parent 0b82ff747e
commit 55ea8790a9
4 changed files with 79 additions and 7 deletions

View File

@ -1,5 +1,14 @@
2007-08-21 Ulrich Drepper <drepper@redhat.com>
[BZ #4936]
* iconv/gconv.c (__gconv): If flush was successful, clear rest of
the state.
* iconvdata/Makefile: Add rules to build and run bug-iconv5.
* iconvdata/bug-iconv5.c: New file.
2007-08-04 Carlos O'Donell <carlos@systemhalted.org> 2007-08-04 Carlos O'Donell <carlos@systemhalted.org>
[BZ #4896]
* elf/elf.h: Define R_PARISC_PLABEL21L, R_PARISC_PLABEL14R, * elf/elf.h: Define R_PARISC_PLABEL21L, R_PARISC_PLABEL14R,
R_PARISC_GNU_VTENTRY, R_PARISC_GNU_VTINHERIT, R_PARISC_TLS_GD21L, R_PARISC_GNU_VTENTRY, R_PARISC_GNU_VTINHERIT, R_PARISC_TLS_GD21L,
R_PARISC_TLS_GD14R, R_PARISC_TLS_GDCALL, R_PARISC_TLS_LDM21L, R_PARISC_TLS_GD14R, R_PARISC_TLS_GDCALL, R_PARISC_TLS_LDM21L,

View File

@ -1,6 +1,6 @@
/* Convert characters in input buffer using conversion descriptor to /* Convert characters in input buffer using conversion descriptor to
output buffer. output buffer.
Copyright (C) 1997-2001, 2005 Free Software Foundation, Inc. Copyright (C) 1997-2001, 2005, 2007 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@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -55,11 +55,19 @@ __gconv (__gconv_t cd, const unsigned char **inbuf,
#endif #endif
if (inbuf == NULL || *inbuf == NULL) if (inbuf == NULL || *inbuf == NULL)
/* We just flush. */ {
result = DL_CALL_FCT (fct, /* We just flush. */
(cd->__steps, cd->__data, NULL, NULL, NULL, result = DL_CALL_FCT (fct,
irreversible, (cd->__steps, cd->__data, NULL, NULL, NULL,
cd->__data[last_step].__outbuf == NULL ? 2 : 1, 0)); irreversible,
cd->__data[last_step].__outbuf == NULL ? 2 : 1,
0));
/* If the flush was successful clear the rest of the state. */
if (result == __GCONV_OK)
for (size_t cnt = 0; cnt <= last_step; ++cnt)
cd->__data[cnt].__invocation_counter = 0;
}
else else
{ {
const unsigned char *last_start; const unsigned char *last_start;

View File

@ -66,7 +66,7 @@ include ../Makeconfig
ifeq (yes,$(build-shared)) ifeq (yes,$(build-shared))
tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \ tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \
tst-iconv6 tst-iconv6 bug-iconv5
ifeq ($(have-thread-library),yes) ifeq ($(have-thread-library),yes)
tests += bug-iconv3 tests += bug-iconv3
endif endif
@ -354,6 +354,8 @@ $(objpfx)bug-iconv2.out: $(objpfx)gconv-modules \
$(objpfx)bug-iconv3: $(libdl) $(objpfx)bug-iconv3: $(libdl)
$(objpfx)bug-iconv3.out: $(objpfx)gconv-modules \ $(objpfx)bug-iconv3.out: $(objpfx)gconv-modules \
$(addprefix $(objpfx),$(modules.so)) $(addprefix $(objpfx),$(modules.so))
$(objpfx)bug-iconv5.out: $(objpfx)gconv-modules \
$(addprefix $(objpfx),$(modules.so))
$(objpfx)tst-loading.out: $(objpfx)gconv-modules \ $(objpfx)tst-loading.out: $(objpfx)gconv-modules \
$(addprefix $(objpfx),$(modules.so)) $(addprefix $(objpfx),$(modules.so))
$(objpfx)tst-iconv4.out: $(objpfx)gconv-modules \ $(objpfx)tst-iconv4.out: $(objpfx)gconv-modules \

53
iconvdata/bug-iconv5.c Normal file
View File

@ -0,0 +1,53 @@
#include <iconv.h>
#include <stdint.h>
#include <stdio.h>
static int
do_test (void)
{
iconv_t cd = iconv_open ("utf-8", "unicode");
if (cd == (iconv_t) -1)
{
puts ("cannot open iconv module");
return 1;
}
static const uint16_t us[] = { 0xfeff, 0x0041, 0x0042, 0x0043 };
char buf[100];
char *inbuf;
size_t inlen;
char *outbuf;
size_t outlen;
size_t n;
inbuf = (char *) us;
inlen = sizeof (us);
outbuf = buf;
outlen = sizeof (buf);
n = iconv (cd, &inbuf, &inlen, &outbuf, &outlen);
if (n == (size_t) -1 || inlen != 0 || outlen != sizeof (buf) - 3)
{
puts ("first conversion failed");
return 1;
}
iconv (cd, NULL, NULL, NULL, NULL);
inbuf = (char *) us;
inlen = sizeof (us);
outbuf = buf;
outlen = sizeof (buf);
n = iconv (cd, &inbuf, &inlen, &outbuf, &outlen);
if (n == (size_t) -1 || inlen != 0 || outlen != sizeof (buf) - 3)
{
puts ("second conversion failed");
return 1;
}
return 0;
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"