forked from OSchip/llvm-project
parent
52252fe20d
commit
0b8602791b
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue