summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc2
-rw-r--r--compiler-rt/test/sanitizer_common/TestCases/Linux/iconv_test.c28
2 files changed, 29 insertions, 1 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
index 7ecde229432..7b4e6d27df3 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -4637,7 +4637,7 @@ INTERCEPTOR(SIZE_T, iconv, void *cd, char **inbuf, SIZE_T *inbytesleft,
// its metadata. See
// https://github.com/google/sanitizers/issues/321.
SIZE_T res = REAL(iconv)(cd, inbuf, inbytesleft, outbuf, outbytesleft);
- if (res != (SIZE_T) - 1 && outbuf && *outbuf > outbuf_orig) {
+ if (outbuf && *outbuf > outbuf_orig) {
SIZE_T sz = (char *)*outbuf - (char *)outbuf_orig;
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, outbuf_orig, sz);
}
diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/iconv_test.c b/compiler-rt/test/sanitizer_common/TestCases/Linux/iconv_test.c
new file mode 100644
index 00000000000..08da34d89a3
--- /dev/null
+++ b/compiler-rt/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);
+}
+
OpenPOWER on IntegriCloud