summaryrefslogtreecommitdiff
path: root/test/sanitizer_common
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2017-04-12 00:12:34 +0000
committerKostya Serebryany <kcc@google.com>2017-04-12 00:12:34 +0000
commitb6240efd1f34bf5e72bd5350166957d829a10d7d (patch)
treefff77712d0cf34ca4c2507019c0130c79b7b0ef7 /test/sanitizer_common
parentef3c0d303156bf2dbc222a292e9785cb66535a33 (diff)
[msan] fix iconv interceptor. before the fix the interceptor failed to mark memory as initialized if iconv returned -1. Found in a hard way while fuzzing libxml2 :(
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@300010 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/sanitizer_common')
-rw-r--r--test/sanitizer_common/TestCases/Linux/iconv_test.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/test/sanitizer_common/TestCases/Linux/iconv_test.c b/test/sanitizer_common/TestCases/Linux/iconv_test.c
new file mode 100644
index 000000000..08da34d89
--- /dev/null
+++ b/test/sanitizer_common/TestCases/Linux/iconv_test.c
@@ -0,0 +1,28 @@
+// RUN: %clang %s -o %t && %run %t
+// Verify that even if iconv returned -1
+// we still treat the initialized part of outbuf as properly initialized.
+#include <iconv.h>
+#include <assert.h>
+#include <stdio.h>
+
+int main() {
+ iconv_t cd = iconv_open("UTF-8", "no");
+ assert(cd != (iconv_t)-1);
+ char in[11] = {0x7e, 0x7e, 0x5f, 0x53, 0x55, 0x3e,
+ 0x99, 0x3c, 0x7e, 0x7e, 0x7e};
+ fprintf(stderr, "cd: %p\n", (void*)cd);
+ char out[100];
+ char *inbuf = &in[0];
+ size_t inbytesleft = 11;
+ char *outbuf = &out[0];
+ size_t outbytesleft = 100;
+ int ret = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ assert(ret == -1);
+ assert(outbuf - &out[0] == 10);
+ for (int i = 0; i < 10; i++) {
+ if (out[i] == 0x77) return 1;
+ fprintf(stderr, "OUT%d 0x%x -- OK\n", i, (unsigned char)out[i]);
+ }
+ iconv_close(cd);
+}
+