diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2013-08-28 20:18:25 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2013-08-28 20:18:25 +0000 |
commit | 5fa3d5d7ec35a704c6362d8d04f03023bb6e95e8 (patch) | |
tree | f728be09965ff0a908aa92c26d87bd5ccbd7cf7c /lib/dfsan/dfsan_custom.cc | |
parent | 6c6374474949329f6ae00318027e9e32aa87057f (diff) |
[dfsan] Add custom function for dl_iterate_phdr.
Differential Revision: http://llvm-reviews.chandlerc.com/D1505
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@189503 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/dfsan/dfsan_custom.cc')
-rw-r--r-- | lib/dfsan/dfsan_custom.cc | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/dfsan/dfsan_custom.cc b/lib/dfsan/dfsan_custom.cc index 31ecdb8f5..239cbe407 100644 --- a/lib/dfsan/dfsan_custom.cc +++ b/lib/dfsan/dfsan_custom.cc @@ -19,6 +19,7 @@ #include <ctype.h> #include <dlfcn.h> +#include <link.h> #include <pthread.h> #include <stdlib.h> #include <string.h> @@ -306,4 +307,36 @@ SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_pthread_create( return rv; } +struct dl_iterate_phdr_info { + int (*callback_trampoline)(void *callback, struct dl_phdr_info *info, + size_t size, void *data, dfsan_label info_label, + dfsan_label size_label, dfsan_label data_label, + dfsan_label *ret_label); + void *callback; + void *data; +}; + +int dl_iterate_phdr_cb(struct dl_phdr_info *info, size_t size, void *data) { + dl_iterate_phdr_info *dipi = (dl_iterate_phdr_info *)data; + dfsan_set_label(0, *info); + dfsan_set_label(0, (void *)info->dlpi_name, strlen(info->dlpi_name) + 1); + dfsan_set_label(0, (void *)info->dlpi_phdr, + sizeof(*info->dlpi_phdr) * info->dlpi_phnum); + dfsan_label ret_label; + return dipi->callback_trampoline(dipi->callback, info, size, dipi->data, 0, 0, + 0, &ret_label); +} + +SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_dl_iterate_phdr( + int (*callback_trampoline)(void *callback, struct dl_phdr_info *info, + size_t size, void *data, dfsan_label info_label, + dfsan_label size_label, dfsan_label data_label, + dfsan_label *ret_label), + void *callback, void *data, dfsan_label callback_label, + dfsan_label data_label, dfsan_label *ret_label) { + dl_iterate_phdr_info dipi = { callback_trampoline, callback, data }; + *ret_label = 0; + return dl_iterate_phdr(dl_iterate_phdr_cb, &dipi); +} + } |