[msan] Intercept getloadavg.

llvm-svn: 297923
This commit is contained in:
Evgeniy Stepanov 2017-03-16 01:06:22 +00:00
parent 6c5bbae7b3
commit d3332fc92f
3 changed files with 35 additions and 0 deletions

View File

@ -6047,6 +6047,21 @@ INTERCEPTOR(void *, getutxline, void *ut) {
#define INIT_UTMPX
#endif
#if SANITIZER_INTERCEPT_GETLOADAVG
INTERCEPTOR(int, getloadavg, double *loadavg, int nelem) {
void *ctx;
COMMON_INTERCEPTOR_ENTER(ctx, getloadavg, loadavg, nelem);
int res = REAL(getloadavg)(loadavg, nelem);
if (res > 0)
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, loadavg, res * sizeof(*loadavg));
return res;
}
#define INIT_GETLOADAVG \
COMMON_INTERCEPT_FUNCTION(getloadavg);
#else
#define INIT_GETLOADAVG
#endif
static void InitializeCommonInterceptors() {
static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];
interceptor_metadata_map = new((void *)&metadata_mem) MetadataHashMap();
@ -6245,4 +6260,5 @@ static void InitializeCommonInterceptors() {
// FIXME: add other *stat interceptors.
INIT_UTMP;
INIT_UTMPX;
INIT_GETLOADAVG;
}

View File

@ -326,6 +326,9 @@
#define SANITIZER_INTERCEPT_UTMP SI_NOT_WINDOWS && !SI_MAC && !SI_FREEBSD
#define SANITIZER_INTERCEPT_UTMPX SI_LINUX_NOT_ANDROID || SI_MAC || SI_FREEBSD
#define SANITIZER_INTERCEPT_GETLOADAVG \
SI_LINUX_NOT_ANDROID || SI_MAC || SI_FREEBSD
#define SANITIZER_INTERCEPT_MALLOPT_AND_MALLINFO (!SI_FREEBSD && !SI_MAC)
#define SANITIZER_INTERCEPT_MEMALIGN (!SI_FREEBSD && !SI_MAC)
#define SANITIZER_INTERCEPT_PVALLOC (!SI_FREEBSD && !SI_MAC)

View File

@ -0,0 +1,16 @@
// RUN: %clangxx_msan -O0 -g %s -o %t && %run %t
#define _BSD_SOURCE
#include <assert.h>
#include <stdlib.h>
#include <sanitizer/msan_interface.h>
int main(void) {
double x[4];
int ret = getloadavg(x, 3);
assert(ret > 0);
assert(ret <= 3);
assert(__msan_test_shadow(x, sizeof(double) * ret) == -1);
assert(__msan_test_shadow(&x[ret], sizeof(double)) == 0);
}