summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/msan/lit_tests/getaddrinfo-positive.cc6
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc5
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)
OpenPOWER on IntegriCloud