diff options
author | Kostya Serebryany <kcc@google.com> | 2017-04-12 00:12:34 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2017-04-12 00:12:34 +0000 |
commit | b6240efd1f34bf5e72bd5350166957d829a10d7d (patch) | |
tree | fff77712d0cf34ca4c2507019c0130c79b7b0ef7 /test/sanitizer_common/TestCases/Linux/iconv_test.c | |
parent | ef3c0d303156bf2dbc222a292e9785cb66535a33 (diff) | |
download | compiler-rt-b6240efd1f34bf5e72bd5350166957d829a10d7d.tar.gz |
[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/TestCases/Linux/iconv_test.c')
-rw-r--r-- | test/sanitizer_common/TestCases/Linux/iconv_test.c | 28 |
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); +} + |