Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[BZ #4896, BZ #4936]
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]
  • Loading branch information
Ulrich Drepper committed Aug 21, 2007
1 parent 0b82ff7 commit 55ea879
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 7 deletions.
9 changes: 9 additions & 0 deletions ChangeLog
@@ -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>

[BZ #4896]
* elf/elf.h: Define R_PARISC_PLABEL21L, R_PARISC_PLABEL14R,
R_PARISC_GNU_VTENTRY, R_PARISC_GNU_VTINHERIT, R_PARISC_TLS_GD21L,
R_PARISC_TLS_GD14R, R_PARISC_TLS_GDCALL, R_PARISC_TLS_LDM21L,
Expand Down
20 changes: 14 additions & 6 deletions iconv/gconv.c
@@ -1,6 +1,6 @@
/* Convert characters in input buffer using conversion descriptor to
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.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
Expand Down Expand Up @@ -55,11 +55,19 @@ __gconv (__gconv_t cd, const unsigned char **inbuf,
#endif

if (inbuf == NULL || *inbuf == NULL)
/* We just flush. */
result = DL_CALL_FCT (fct,
(cd->__steps, cd->__data, NULL, NULL, NULL,
irreversible,
cd->__data[last_step].__outbuf == NULL ? 2 : 1, 0));
{
/* We just flush. */
result = DL_CALL_FCT (fct,
(cd->__steps, cd->__data, NULL, NULL, NULL,
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
{
const unsigned char *last_start;
Expand Down
4 changes: 3 additions & 1 deletion iconvdata/Makefile
Expand Up @@ -66,7 +66,7 @@ include ../Makeconfig

ifeq (yes,$(build-shared))
tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \
tst-iconv6
tst-iconv6 bug-iconv5
ifeq ($(have-thread-library),yes)
tests += bug-iconv3
endif
Expand Down Expand Up @@ -354,6 +354,8 @@ $(objpfx)bug-iconv2.out: $(objpfx)gconv-modules \
$(objpfx)bug-iconv3: $(libdl)
$(objpfx)bug-iconv3.out: $(objpfx)gconv-modules \
$(addprefix $(objpfx),$(modules.so))
$(objpfx)bug-iconv5.out: $(objpfx)gconv-modules \
$(addprefix $(objpfx),$(modules.so))
$(objpfx)tst-loading.out: $(objpfx)gconv-modules \
$(addprefix $(objpfx),$(modules.so))
$(objpfx)tst-iconv4.out: $(objpfx)gconv-modules \
Expand Down
53 changes: 53 additions & 0 deletions iconvdata/bug-iconv5.c
@@ -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"

0 comments on commit 55ea879

Please sign in to comment.