diff options
| -rw-r--r-- | compiler-rt/lib/msan/lit_tests/getaddrinfo-positive.cc | 6 | ||||
| -rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc | 5 |
2 files changed, 8 insertions, 3 deletions
diff --git a/compiler-rt/lib/msan/lit_tests/getaddrinfo-positive.cc b/compiler-rt/lib/msan/lit_tests/getaddrinfo-positive.cc index 6f74aef83df..7fde1fdfab9 100644 --- a/compiler-rt/lib/msan/lit_tests/getaddrinfo-positive.cc +++ b/compiler-rt/lib/msan/lit_tests/getaddrinfo-positive.cc @@ -8,10 +8,14 @@ #include <netdb.h> #include <stdlib.h> +volatile int z; + int main(void) { struct addrinfo *ai; struct addrinfo hint; - int res = getaddrinfo("localhost", NULL, &hint, &ai); + int res = getaddrinfo("localhost", NULL, NULL, &ai); + if (ai) z = 1; // OK + res = getaddrinfo("localhost", NULL, &hint, &ai); // CHECK: UMR in __interceptor_getaddrinfo at offset 0 inside // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value // CHECK: #0 {{.*}} in main {{.*}}getaddrinfo-positive.cc:[[@LINE-3]] diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc index 8c0fb55f3ce..2d05145720a 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -760,10 +760,11 @@ INTERCEPTOR(int, getaddrinfo, char *node, char *service, if (hints) COMMON_INTERCEPTOR_READ_RANGE(ctx, hints, sizeof(__sanitizer_addrinfo)); int res = REAL(getaddrinfo)(node, service, hints, out); - if (res == 0) { + if (res == 0 && out) { + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, out, sizeof(*out)); struct __sanitizer_addrinfo *p = *out; while (p) { - COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p, sizeof(__sanitizer_addrinfo)); + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p, sizeof(*p)); if (p->ai_addr) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, p->ai_addr, struct_sockaddr_sz); if (p->ai_canonname) |

