[sanitizer] Fix getpwuid_r (and similar) interceptors missing one of the arguments.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 14 Feb 2014 12:32:15 +0000 (12:32 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 14 Feb 2014 12:32:15 +0000 (12:32 +0000)
llvm-svn: 201410

compiler-rt/lib/msan/tests/msan_test.cc
compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc

index e42153c..81b96e5 100644 (file)
@@ -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) {
index fd84ea1..87862d8 100644 (file)
@@ -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      \