summaryrefslogtreecommitdiff
path: root/test/iconv/tst-iconv4.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/iconv/tst-iconv4.c')
-rw-r--r--test/iconv/tst-iconv4.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/test/iconv/tst-iconv4.c b/test/iconv/tst-iconv4.c
new file mode 100644
index 0000000..bba30f6
--- /dev/null
+++ b/test/iconv/tst-iconv4.c
@@ -0,0 +1,71 @@
+// Derived from BZ #9793
+#include <errno.h>
+#include <stdio.h>
+
+#if defined(__GLIBC__) && !defined(__UCLIBC__)
+#include <iconv.h>
+#endif
+
+static int
+do_test (void)
+{
+#if defined(__GLIBC__) && !defined(__UCLIBC__)
+ 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;
+#else
+ return 23;
+#endif
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"