From b6240efd1f34bf5e72bd5350166957d829a10d7d Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Wed, 12 Apr 2017 00:12:34 +0000 Subject: [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 --- test/sanitizer_common/TestCases/Linux/iconv_test.c | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 test/sanitizer_common/TestCases/Linux/iconv_test.c (limited to 'test/sanitizer_common') 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 +#include +#include + +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); +} + -- cgit v1.2.3