summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc16
-rw-r--r--compiler-rt/test/msan/Linux/fopencookie.cc6
2 files changed, 15 insertions, 7 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
index 9b75a3058c0..a7772b7394a 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -4965,29 +4965,31 @@ struct WrappedCookie {
static uptr wrapped_read(void *cookie, char *buf, uptr size) {
COMMON_INTERCEPTOR_UNPOISON_PARAM(3);
WrappedCookie *wrapped_cookie = (WrappedCookie *)cookie;
- return wrapped_cookie->real_io_funcs.read(wrapped_cookie->real_cookie, buf,
- size);
+ __sanitizer_cookie_io_read real_read = wrapped_cookie->real_io_funcs.read;
+ return real_read ? real_read(wrapped_cookie->real_cookie, buf, size) : 0;
}
static uptr wrapped_write(void *cookie, const char *buf, uptr size) {
COMMON_INTERCEPTOR_UNPOISON_PARAM(3);
WrappedCookie *wrapped_cookie = (WrappedCookie *)cookie;
- return wrapped_cookie->real_io_funcs.write(wrapped_cookie->real_cookie, buf,
- size);
+ __sanitizer_cookie_io_write real_write = wrapped_cookie->real_io_funcs.write;
+ return real_write ? real_write(wrapped_cookie->real_cookie, buf, size) : size;
}
static int wrapped_seek(void *cookie, u64 *offset, int whence) {
COMMON_INTERCEPTOR_UNPOISON_PARAM(3);
COMMON_INTERCEPTOR_INITIALIZE_RANGE(offset, sizeof(*offset));
WrappedCookie *wrapped_cookie = (WrappedCookie *)cookie;
- return wrapped_cookie->real_io_funcs.seek(wrapped_cookie->real_cookie, offset,
- whence);
+ __sanitizer_cookie_io_seek real_seek = wrapped_cookie->real_io_funcs.seek;
+ return real_seek ? real_seek(wrapped_cookie->real_cookie, offset, whence)
+ : -1;
}
static int wrapped_close(void *cookie) {
COMMON_INTERCEPTOR_UNPOISON_PARAM(1);
WrappedCookie *wrapped_cookie = (WrappedCookie *)cookie;
- int res = wrapped_cookie->real_io_funcs.close(wrapped_cookie->real_cookie);
+ __sanitizer_cookie_io_close real_close = wrapped_cookie->real_io_funcs.close;
+ int res = real_close ? real_close(wrapped_cookie->real_cookie) : 0;
InternalFree(wrapped_cookie);
return res;
}
diff --git a/compiler-rt/test/msan/Linux/fopencookie.cc b/compiler-rt/test/msan/Linux/fopencookie.cc
index e9616d502e2..e5b8f936e0d 100644
--- a/compiler-rt/test/msan/Linux/fopencookie.cc
+++ b/compiler-rt/test/msan/Linux/fopencookie.cc
@@ -56,4 +56,10 @@ int main() {
fread(buf, 50, 1, f);
fwrite(buf, 50, 1, f);
fclose(f);
+
+ f = fopencookie(cookie, "rw", {nullptr, nullptr, nullptr, nullptr});
+ fseek(f, 100, SEEK_SET);
+ fread(buf, 50, 1, f);
+ fwrite(buf, 50, 1, f);
+ fclose(f);
}
OpenPOWER on IntegriCloud