summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-02-14 12:32:15 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-02-14 12:32:15 +0000
commita21280307fc151f3482032059b08c2fbbe7b8efa (patch)
tree4794382ea3ee12eb335b5018789e1d025a6124b6
parentcf907f4d3824014523e3f7d9f66904d73bd0c635 (diff)
downloadbcm5719-llvm-a21280307fc151f3482032059b08c2fbbe7b8efa.tar.gz
bcm5719-llvm-a21280307fc151f3482032059b08c2fbbe7b8efa.zip
[sanitizer] Fix getpwuid_r (and similar) interceptors missing one of the arguments.
llvm-svn: 201410
-rw-r--r--compiler-rt/lib/msan/tests/msan_test.cc16
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc4
2 files changed, 20 insertions, 0 deletions
diff --git a/compiler-rt/lib/msan/tests/msan_test.cc b/compiler-rt/lib/msan/tests/msan_test.cc
index e42153cf564..81b96e55f91 100644
--- a/compiler-rt/lib/msan/tests/msan_test.cc
+++ b/compiler-rt/lib/msan/tests/msan_test.cc
@@ -3006,6 +3006,20 @@ TEST(MemorySanitizer, getpwuid) {
ASSERT_EQ(p->pw_uid, 0);
}
+TEST(MemorySanitizer, getpwuid_r) {
+ struct passwd pwd;
+ struct passwd *pwdres;
+ char buf[10000];
+ int res = getpwuid_r(0, &pwd, buf, sizeof(buf), &pwdres);
+ ASSERT_EQ(0, res);
+ EXPECT_NOT_POISONED(pwd.pw_name);
+ ASSERT_TRUE(pwd.pw_name != NULL);
+ EXPECT_NOT_POISONED(pwd.pw_name[0]);
+ EXPECT_NOT_POISONED(pwd.pw_uid);
+ ASSERT_EQ(pwd.pw_uid, 0);
+ EXPECT_NOT_POISONED(pwdres);
+}
+
TEST(MemorySanitizer, getpwnam_r) {
struct passwd pwd;
struct passwd *pwdres;
@@ -3017,6 +3031,7 @@ TEST(MemorySanitizer, getpwnam_r) {
EXPECT_NOT_POISONED(pwd.pw_name[0]);
EXPECT_NOT_POISONED(pwd.pw_uid);
ASSERT_EQ(pwd.pw_uid, 0);
+ EXPECT_NOT_POISONED(pwdres);
}
TEST(MemorySanitizer, getpwnam_r_positive) {
@@ -3040,6 +3055,7 @@ TEST(MemorySanitizer, getgrnam_r) {
ASSERT_TRUE(grp.gr_name != NULL);
EXPECT_NOT_POISONED(grp.gr_name[0]);
EXPECT_NOT_POISONED(grp.gr_gid);
+ EXPECT_NOT_POISONED(grpres);
}
TEST(MemorySanitizer, getgroups) {
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
index fd84ea15af1..87862d874c0 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -917,6 +917,7 @@ INTERCEPTOR(int, getpwnam_r, const char *name, void *pwd, char *buf,
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, pwd, struct_passwd_sz);
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen);
}
+ if (result) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result));
return res;
}
INTERCEPTOR(int, getpwuid_r, u32 uid, void *pwd, char *buf, SIZE_T buflen,
@@ -928,6 +929,7 @@ INTERCEPTOR(int, getpwuid_r, u32 uid, void *pwd, char *buf, SIZE_T buflen,
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, pwd, struct_passwd_sz);
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen);
}
+ if (result) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result));
return res;
}
INTERCEPTOR(int, getgrnam_r, const char *name, void *grp, char *buf,
@@ -940,6 +942,7 @@ INTERCEPTOR(int, getgrnam_r, const char *name, void *grp, char *buf,
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, grp, struct_group_sz);
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen);
}
+ if (result) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result));
return res;
}
INTERCEPTOR(int, getgrgid_r, u32 gid, void *grp, char *buf, SIZE_T buflen,
@@ -951,6 +954,7 @@ INTERCEPTOR(int, getgrgid_r, u32 gid, void *grp, char *buf, SIZE_T buflen,
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, grp, struct_group_sz);
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen);
}
+ if (result) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result));
return res;
}
#define INIT_GETPWNAM_R_AND_FRIENDS \
OpenPOWER on IntegriCloud