diff options
| author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-02-14 12:32:15 +0000 |
|---|---|---|
| committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-02-14 12:32:15 +0000 |
| commit | a21280307fc151f3482032059b08c2fbbe7b8efa (patch) | |
| tree | 4794382ea3ee12eb335b5018789e1d025a6124b6 | |
| parent | cf907f4d3824014523e3f7d9f66904d73bd0c635 (diff) | |
| download | bcm5719-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.cc | 16 | ||||
| -rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc | 4 |
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 \ |

