[compiler-rt] r373993 - [msan] Add interceptors: crypt, crypt_r.

Evgeniy Stepanov via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 7 17:00:30 PDT 2019


Author: eugenis
Date: Mon Oct  7 17:00:30 2019
New Revision: 373993

URL: http://llvm.org/viewvc/llvm-project?rev=373993&view=rev
Log:
[msan] Add interceptors: crypt, crypt_r.

Reviewers: vitalybuka

Subscribers: srhines, #sanitizers, llvm-commits

Tags: #sanitizers, #llvm

Differential Revision: https://reviews.llvm.org/D68431

Added:
    compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/crypt_r.cpp
    compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/crypt.cpp
Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=373993&r1=373992&r2=373993&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc Mon Oct  7 17:00:30 2019
@@ -9573,6 +9573,41 @@ INTERCEPTOR(SSIZE_T, getrandom, void *bu
 #define INIT_GETRANDOM
 #endif
 
+#if SANITIZER_INTERCEPT_CRYPT
+INTERCEPTOR(char *, crypt, char *key, char *salt) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, crypt, key, salt);
+  COMMON_INTERCEPTOR_READ_RANGE(ctx, key, internal_strlen(key) + 1);
+  COMMON_INTERCEPTOR_READ_RANGE(ctx, salt, internal_strlen(salt) + 1);
+  char *res = REAL(crypt)(key, salt);
+  if (res != nullptr)
+    COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, internal_strlen(res) + 1);
+  return res;
+}
+#define INIT_CRYPT COMMON_INTERCEPT_FUNCTION(crypt);
+#else
+#define INIT_CRYPT
+#endif
+
+#if SANITIZER_INTERCEPT_CRYPT_R
+INTERCEPTOR(char *, crypt_r, char *key, char *salt, void *data) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, crypt_r, key, salt, data);
+  COMMON_INTERCEPTOR_READ_RANGE(ctx, key, internal_strlen(key) + 1);
+  COMMON_INTERCEPTOR_READ_RANGE(ctx, salt, internal_strlen(salt) + 1);
+  char *res = REAL(crypt_r)(key, salt, data);
+  if (res != nullptr) {
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data,
+                                   __sanitizer::struct_crypt_data_sz);
+    COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, internal_strlen(res) + 1);
+  }
+  return res;
+}
+#define INIT_CRYPT_R COMMON_INTERCEPT_FUNCTION(crypt_r);
+#else
+#define INIT_CRYPT_R
+#endif
+
 static void InitializeCommonInterceptors() {
 #if SI_POSIX
   static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];
@@ -9871,6 +9906,8 @@ static void InitializeCommonInterceptors
   INIT_GETUSERSHELL;
   INIT_SL_INIT;
   INIT_GETRANDOM;
+  INIT_CRYPT;
+  INIT_CRYPT_R;
 
   INIT___PRINTF_CHK;
 }

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h?rev=373993&r1=373992&r2=373993&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h Mon Oct  7 17:00:30 2019
@@ -566,6 +566,8 @@
 #define SANITIZER_INTERCEPT_FDEVNAME SI_FREEBSD
 #define SANITIZER_INTERCEPT_GETUSERSHELL (SI_POSIX && !SI_ANDROID)
 #define SANITIZER_INTERCEPT_SL_INIT (SI_FREEBSD || SI_NETBSD)
+#define SANITIZER_INTERCEPT_CRYPT (SI_POSIX && !SI_ANDROID)
+#define SANITIZER_INTERCEPT_CRYPT_R (SI_LINUX && !SI_ANDROID)
 
 #define SANITIZER_INTERCEPT_GETRANDOM (SI_LINUX && __GLIBC_PREREQ(2, 25))
 #define SANITIZER_INTERCEPT___CXA_ATEXIT SI_NETBSD

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp?rev=373993&r1=373992&r2=373993&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp Mon Oct  7 17:00:30 2019
@@ -140,6 +140,7 @@ typedef struct user_fpregs elf_fpregset_
 #include <linux/serial.h>
 #include <sys/msg.h>
 #include <sys/ipc.h>
+#include <crypt.h>
 #endif // SANITIZER_LINUX && !SANITIZER_ANDROID
 
 #if SANITIZER_ANDROID
@@ -240,6 +241,7 @@ namespace __sanitizer {
   unsigned struct_ustat_sz = SIZEOF_STRUCT_USTAT;
   unsigned struct_rlimit64_sz = sizeof(struct rlimit64);
   unsigned struct_statvfs64_sz = sizeof(struct statvfs64);
+  unsigned struct_crypt_data_sz = sizeof(struct crypt_data);
 #endif // SANITIZER_LINUX && !SANITIZER_ANDROID
 
 #if SANITIZER_LINUX && !SANITIZER_ANDROID

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h?rev=373993&r1=373992&r2=373993&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h Mon Oct  7 17:00:30 2019
@@ -304,6 +304,7 @@ extern unsigned struct_msqid_ds_sz;
 extern unsigned struct_mq_attr_sz;
 extern unsigned struct_timex_sz;
 extern unsigned struct_statvfs_sz;
+extern unsigned struct_crypt_data_sz;
 #endif  // SANITIZER_LINUX && !SANITIZER_ANDROID
 
 struct __sanitizer_iovec {

Added: compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/crypt_r.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/crypt_r.cpp?rev=373993&view=auto
==============================================================================
--- compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/crypt_r.cpp (added)
+++ compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/crypt_r.cpp Mon Oct  7 17:00:30 2019
@@ -0,0 +1,37 @@
+// RUN: %clangxx -O0 -g %s -lcrypt -o %t && %run %t
+
+#include <assert.h>
+#include <unistd.h>
+#include <cstring>
+#include <crypt.h>
+
+#include <sanitizer/msan_interface.h>
+
+int
+main (int argc, char** argv)
+{
+  {
+    crypt_data cd;
+    cd.initialized = 0;
+    char *p = crypt_r("abcdef", "xz", &cd);
+    volatile size_t z = strlen(p);
+  }
+  {
+    crypt_data cd;
+    cd.initialized = 0;
+    char *p = crypt_r("abcdef", "$1$", &cd);
+    volatile size_t z = strlen(p);
+  }
+  {
+    crypt_data cd;
+    cd.initialized = 0;
+    char *p = crypt_r("abcdef", "$5$", &cd);
+    volatile size_t z = strlen(p);
+  }
+  {
+    crypt_data cd;
+    cd.initialized = 0;
+    char *p = crypt_r("abcdef", "$6$", &cd);
+    volatile size_t z = strlen(p);
+  }
+}

Added: compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/crypt.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/crypt.cpp?rev=373993&view=auto
==============================================================================
--- compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/crypt.cpp (added)
+++ compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/crypt.cpp Mon Oct  7 17:00:30 2019
@@ -0,0 +1,26 @@
+// RUN: %clangxx -O0 -g %s -o %t -lcrypt && %run %t
+
+#include <assert.h>
+#include <unistd.h>
+#include <cstring>
+
+int
+main (int argc, char** argv)
+{
+  {
+    char *p = crypt("abcdef", "xz");
+    volatile size_t z = strlen(p);
+  }
+  {
+    char *p = crypt("abcdef", "$1$");
+    volatile size_t z = strlen(p);
+  }
+  {
+    char *p = crypt("abcdef", "$5$");
+    volatile size_t z = strlen(p);
+  }
+  {
+    char *p = crypt("abcdef", "$6$");
+    volatile size_t z = strlen(p);
+  }
+}




More information about the llvm-commits mailing list