forked from OSchip/llvm-project
[msan] Add interceptors: crypt, crypt_r.
Reviewers: vitalybuka Subscribers: srhines, #sanitizers, llvm-commits Tags: #sanitizers, #llvm Differential Revision: https://reviews.llvm.org/D68431 llvm-svn: 373993
This commit is contained in:
parent
4fde20f4e4
commit
2e2c934762
|
@ -9573,6 +9573,41 @@ INTERCEPTOR(SSIZE_T, getrandom, void *buf, SIZE_T buflen, unsigned int flags) {
|
|||
#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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -140,6 +140,7 @@ typedef struct user_fpregs elf_fpregset_t;
|
|||
#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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue