[msan] Intercept __strxfrm_l.

llvm-svn: 316613
This commit is contained in:
Evgeniy Stepanov 2017-10-25 21:40:17 +00:00
parent 52252fe20d
commit 0b8602791b
3 changed files with 43 additions and 2 deletions

View File

@ -457,6 +457,20 @@ INTERCEPTOR(SIZE_T, strxfrm_l, char *dest, const char *src, SIZE_T n,
return res;
}
#if SANITIZER_LINUX
INTERCEPTOR(SIZE_T, __strxfrm_l, char *dest, const char *src, SIZE_T n,
void *loc) {
ENSURE_MSAN_INITED();
CHECK_UNPOISONED(src, REAL(strlen)(src) + 1);
SIZE_T res = REAL(__strxfrm_l)(dest, src, n, loc);
if (res < n) __msan_unpoison(dest, res + 1);
return res;
}
#define MSAN_MAYBE_INTERCEPT___STRXFRM_L INTERCEPT_FUNCTION(__strxfrm_l)
#else
#define MSAN_MAYBE_INTERCEPT___STRXFRM_L
#endif
#define INTERCEPTOR_STRFTIME_BODY(char_type, ret_type, func, s, ...) \
ENSURE_MSAN_INITED(); \
ret_type res = REAL(func)(s, __VA_ARGS__); \
@ -1521,6 +1535,7 @@ void InitializeInterceptors() {
#endif
INTERCEPT_FUNCTION(strxfrm);
INTERCEPT_FUNCTION(strxfrm_l);
MSAN_MAYBE_INTERCEPT___STRXFRM_L;
INTERCEPT_FUNCTION(strftime);
INTERCEPT_FUNCTION(strftime_l);
MSAN_MAYBE_INTERCEPT___STRFTIME_L;

View File

@ -0,0 +1,19 @@
// RUN: %clangxx_msan -std=c++11 -O0 -g %s -o %t && %run %t
// REQUIRES: x86_64-linux
#include <assert.h>
#include <locale.h>
#include <sanitizer/msan_interface.h>
#include <stdlib.h>
#include <string.h>
extern "C" decltype(strxfrm_l) __strxfrm_l;
int main(void) {
char q[10];
locale_t loc = newlocale(LC_ALL_MASK, "", (locale_t)0);
size_t n = __strxfrm_l(q, "qwerty", sizeof(q), loc);
assert(n < sizeof(q));
__msan_check_mem_is_initialized(q, n + 1);
return 0;
}

View File

@ -1,14 +1,21 @@
// RUN: %clangxx_msan -O0 -g %s -o %t && %run %t
#include <assert.h>
#include <locale.h>
#include <sanitizer/msan_interface.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char *p = "abcdef";
char q[10];
size_t n = strxfrm(q, p, sizeof(q));
size_t n = strxfrm(q, "abcdef", sizeof(q));
assert(n < sizeof(q));
__msan_check_mem_is_initialized(q, n + 1);
locale_t loc = newlocale(LC_ALL_MASK, "", (locale_t)0);
__msan_poison(&q, sizeof(q));
n = strxfrm_l(q, "qwerty", sizeof(q), loc);
assert(n < sizeof(q));
__msan_check_mem_is_initialized(q, n + 1);
return 0;