summary refs log tree commit diff
path: root/iconvdata
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-08-21 14:43:18 +0000
committerUlrich Drepper <drepper@redhat.com>2007-08-21 14:43:18 +0000
commit55ea8790a9fdb6e1320be8e5ad84bca04dbf9a7d (patch)
tree8228ddea4603f6c82e9005f62c56c73bff62be9d /iconvdata
parent0b82ff747eede0f77c524bfce4cf93cb929a953f (diff)
downloadglibc-55ea8790a9fdb6e1320be8e5ad84bca04dbf9a7d.tar.gz
glibc-55ea8790a9fdb6e1320be8e5ad84bca04dbf9a7d.tar.xz
glibc-55ea8790a9fdb6e1320be8e5ad84bca04dbf9a7d.zip
[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]
Diffstat (limited to 'iconvdata')
-rw-r--r--iconvdata/Makefile4
-rw-r--r--iconvdata/bug-iconv5.c53
2 files changed, 56 insertions, 1 deletions
diff --git a/iconvdata/Makefile b/iconvdata/Makefile
index 8b49367bd4..26bf61ed5e 100644
--- a/iconvdata/Makefile
+++ b/iconvdata/Makefile
@@ -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
@@ -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 \
diff --git a/iconvdata/bug-iconv5.c b/iconvdata/bug-iconv5.c
new file mode 100644
index 0000000000..1b9f50f58a
--- /dev/null
+++ b/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"