diff options
Diffstat (limited to 'test/hwasan/TestCases/Linux/decorate-proc-maps.c')
-rw-r--r-- | test/hwasan/TestCases/Linux/decorate-proc-maps.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/test/hwasan/TestCases/Linux/decorate-proc-maps.c b/test/hwasan/TestCases/Linux/decorate-proc-maps.c new file mode 100644 index 000000000..8d5824091 --- /dev/null +++ b/test/hwasan/TestCases/Linux/decorate-proc-maps.c @@ -0,0 +1,59 @@ +// RUN: %clang_hwasan -g %s -o %t +// RUN: %env_hwasan_opts=decorate_proc_maps=1 %run %t 2>&1 | FileCheck %s --check-prefix=A +// RUN: %env_hwasan_opts=decorate_proc_maps=1 %run %t 2>&1 | FileCheck %s --check-prefix=B + +// A: rw-p {{.*}}hwasan threads] +// A-NEXT: ---p {{.*}}shadow gap] +// A-NEXT: rw-p {{.*}}low shadow] +// A-NEXT: ---p {{.*}}shadow gap] +// A-NEXT: rw-p {{.*}}high shadow] + +// B-DAG: rw-p {{.*}}SizeClassAllocator: region data] +// B-DAG: rw-p {{.*}}SizeClassAllocator: region metadata] +// B-DAG: rw-p {{.*}}SizeClassAllocator: freearray] +// B-DAG: rw-p {{.*}}SizeClassAllocator: region info] +// B-DAG: rw-p {{.*}}LargeMmapAllocator] +// B-DAG: rw-p {{.*}}stack depot] + +#include <errno.h> +#include <fcntl.h> +#include <pthread.h> +#include <stdio.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> +#include <pthread.h> +#include <stdlib.h> + +void CopyFdToFd(int in_fd, int out_fd) { + const size_t kBufSize = 0x10000; + static char buf[kBufSize]; + while (1) { + ssize_t got = read(in_fd, buf, kBufSize); + if (got > 0) { + write(out_fd, buf, got); + } else if (got == 0) { + break; + } else if (errno != EAGAIN || errno != EWOULDBLOCK || errno != EINTR) { + fprintf(stderr, "error reading file, errno %d\n", errno); + abort(); + } + } +} + +void *ThreadFn(void *arg) { + (void)arg; + int fd = open("/proc/self/maps", O_RDONLY); + CopyFdToFd(fd, 2); + close(fd); + return NULL; +} + +int main(void) { + pthread_t t; + void * volatile res = malloc(100); + void * volatile res2 = malloc(100000); + pthread_create(&t, 0, ThreadFn, 0); + pthread_join(t, 0); + return (int)(size_t)res; +} |