about summary refs log tree commit diff
path: root/iconv/tst-iconv4.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2009-02-03 01:31:30 +0000
committerUlrich Drepper <drepper@redhat.com>2009-02-03 01:31:30 +0000
commit1b14353ee3b4e840e3722fd3dbf1a371fc73f0ca (patch)
treeb9e47fbe4335af7bdfd85587abbbbaefe58ef97a /iconv/tst-iconv4.c
parentebc22416e4ab003dbe67c53590cfeaefd2b37da6 (diff)
downloadglibc-1b14353ee3b4e840e3722fd3dbf1a371fc73f0ca.tar.gz
glibc-1b14353ee3b4e840e3722fd3dbf1a371fc73f0ca.tar.xz
glibc-1b14353ee3b4e840e3722fd3dbf1a371fc73f0ca.zip
[BZ #9793]
2009-02-02  Ulrich Drepper  <drepper@redhat.com>
	[BZ #9793]
	* iconv/gconv_trans.c (__gconv_transliterate): Don't change
	*OUTBUFSTART unless the whole output fit into the buffer.
	* iconv/Makefile (tests): Add tst-iconv4.
	* iconv/tst-iconv4.c: New file.
Diffstat (limited to 'iconv/tst-iconv4.c')
-rw-r--r--iconv/tst-iconv4.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/iconv/tst-iconv4.c b/iconv/tst-iconv4.c
new file mode 100644
index 0000000000..b5ff39306c
--- /dev/null
+++ b/iconv/tst-iconv4.c
@@ -0,0 +1,65 @@
+// Derived from BZ #9793
+#include <errno.h>
+#include <iconv.h>
+#include <stdio.h>
+
+
+static int
+do_test (void)
+{
+  iconv_t cd = iconv_open ("ASCII//TRANSLIT", "UTF-8");
+  if (cd == (iconv_t) -1)
+    {
+      puts ("iconv_open failed");
+      return 1;
+    }
+
+  char input[2] = { 0xc2, 0xae };	/* Registered trademark */
+  char *inptr = input;
+  size_t insize = sizeof (input);
+  char output[2];			/* Too short to contain "(R)".  */
+  char *outptr = output;
+  size_t outsize = sizeof (output);
+
+  size_t ret = iconv (cd, &inptr, &insize, &outptr, &outsize);
+  if (ret != (size_t) -1)
+    {
+      puts ("iconv succeeded");
+      return 1;
+    }
+  if (errno != E2BIG)
+    {
+      puts ("iconv did not set errno to E2BIG");
+      return 1;
+    }
+  int res = 0;
+  if (inptr != input)
+    {
+      puts ("inptr changed");
+      res = 1;
+    }
+  if (insize != sizeof (input))
+    {
+      puts ("insize changed");
+      res = 1;
+    }
+  if (outptr != output)
+    {
+      puts ("outptr changed");
+      res = 1;
+    }
+  if (outsize != sizeof (output))
+    {
+      puts ("outsize changed");
+      res = 1;
+    }
+  if (iconv_close (cd) == -1)
+    {
+      puts ("iconv_close failed");
+      res = 1;
+    }
+  return res;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"