Add MSan interceptor for fstat(2)

Summary:
Add new MSan interceptor that corrects NetBSD's
specific handling of fstat(2).

NetBSD renames the call to __fstat50.

Add new test: test/msan/fstat.cc

Sponsored by <The NetBSD Foundation>

Reviewers: joerg, eugenis, vitalybuka

Reviewed By: vitalybuka

Subscribers: llvm-commits, #sanitizers

Tags: #sanitizers

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

llvm-svn: 321765
This commit is contained in:
Kamil Rytarowski 2018-01-03 22:28:39 +00:00
parent cf524a408a
commit 31abb45803
2 changed files with 30 additions and 0 deletions

View File

@ -35,6 +35,7 @@
#include "sanitizer_common/sanitizer_tls_get_addr.h"
#if SANITIZER_NETBSD
#define fstat __fstat50
#define gettimeofday __gettimeofday50
#define getrusage __getrusage50
#endif
@ -688,6 +689,19 @@ INTERCEPTOR(int, putenv, char *string) {
return res;
}
#if SANITIZER_NETBSD
INTERCEPTOR(int, fstat, int fd, void *buf) {
ENSURE_MSAN_INITED();
int res = REAL(fstat)(fd, buf);
if (!res)
__msan_unpoison(buf, __sanitizer::struct_stat_sz);
return res;
}
#define MSAN_MAYBE_INTERCEPT_FSTAT INTERCEPT_FUNCTION(fstat)
#else
#define MSAN_MAYBE_INTERCEPT_FSTAT
#endif
#if !SANITIZER_FREEBSD && !SANITIZER_NETBSD
INTERCEPTOR(int, __fxstat, int magic, int fd, void *buf) {
ENSURE_MSAN_INITED();
@ -1633,6 +1647,7 @@ void InitializeInterceptors() {
INTERCEPT_FUNCTION(putenv);
INTERCEPT_FUNCTION(gettimeofday);
MSAN_MAYBE_INTERCEPT_FCVT;
MSAN_MAYBE_INTERCEPT_FSTAT;
MSAN_MAYBE_INTERCEPT___FXSTAT;
MSAN_INTERCEPT_FSTATAT;
MSAN_MAYBE_INTERCEPT___FXSTAT64;

View File

@ -0,0 +1,15 @@
// RUN: %clangxx_msan -O0 %s -o %t && %run %t
#include <sys/stat.h>
#include <stdlib.h>
int main(void) {
struct stat st;
if (fstat(0, &st))
exit(1);
if (S_ISBLK(st.st_mode))
exit(0);
return 0;
}