mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 19:06:44 +00:00
[Sanitizers] Introduce GET_LINK_MAP_BY_DLOPEN_HANDLE() macro
Differential Revision: http://reviews.llvm.org/D7233 llvm-svn: 227570
This commit is contained in:
parent
c897af3ffc
commit
07e6c00171
@ -172,7 +172,8 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
|
||||
} while (false)
|
||||
#define COMMON_INTERCEPTOR_BLOCK_REAL(name) REAL(name)
|
||||
#define COMMON_INTERCEPTOR_ON_EXIT(ctx) OnExit()
|
||||
#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, res) CoverageUpdateMapping()
|
||||
#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, handle) \
|
||||
CoverageUpdateMapping()
|
||||
#define COMMON_INTERCEPTOR_LIBRARY_UNLOADED() CoverageUpdateMapping()
|
||||
#define COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED (!asan_inited)
|
||||
#include "sanitizer_common/sanitizer_common_interceptors.inc"
|
||||
|
@ -314,11 +314,12 @@ static void unpoison(const void *ptr, uptr size) {
|
||||
SANITIZER_INTERFACE_ATTRIBUTE void *
|
||||
__dfsw_dlopen(const char *filename, int flag, dfsan_label filename_label,
|
||||
dfsan_label flag_label, dfsan_label *ret_label) {
|
||||
link_map *map = (link_map *)dlopen(filename, flag);
|
||||
void *handle = dlopen(filename, flag);
|
||||
link_map *map = GET_LINK_MAP_BY_DLOPEN_HANDLE(handle);
|
||||
if (map)
|
||||
ForEachMappedRegion(map, unpoison);
|
||||
*ret_label = 0;
|
||||
return (void *)map;
|
||||
return handle;
|
||||
}
|
||||
|
||||
struct pthread_create_info {
|
||||
|
@ -1378,8 +1378,11 @@ int OnExit() {
|
||||
} while (false) // FIXME
|
||||
#define COMMON_INTERCEPTOR_BLOCK_REAL(name) REAL(name)
|
||||
#define COMMON_INTERCEPTOR_ON_EXIT(ctx) OnExit()
|
||||
#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, map) \
|
||||
if (map) ForEachMappedRegion((link_map *)map, __msan_unpoison);
|
||||
#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, handle) \
|
||||
do { \
|
||||
link_map *map = GET_LINK_MAP_BY_DLOPEN_HANDLE((handle)); \
|
||||
if (map) ForEachMappedRegion(map, __msan_unpoison); \
|
||||
} while (false)
|
||||
|
||||
#include "sanitizer_common/sanitizer_common_interceptors.inc"
|
||||
|
||||
|
@ -85,7 +85,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef COMMON_INTERCEPTOR_LIBRARY_LOADED
|
||||
#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, map) {}
|
||||
#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, handle) {}
|
||||
#endif
|
||||
|
||||
#ifndef COMMON_INTERCEPTOR_LIBRARY_UNLOADED
|
||||
|
@ -771,6 +771,7 @@ bool LibraryNameIs(const char *full_name, const char *base_name) {
|
||||
#if !SANITIZER_ANDROID
|
||||
// Call cb for each region mapped by map.
|
||||
void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr)) {
|
||||
CHECK_NE(map, nullptr);
|
||||
#if !SANITIZER_FREEBSD
|
||||
typedef ElfW(Phdr) Elf_Phdr;
|
||||
typedef ElfW(Ehdr) Elf_Ehdr;
|
||||
|
@ -18,6 +18,15 @@
|
||||
#include "sanitizer_internal_defs.h"
|
||||
#include "sanitizer_platform.h"
|
||||
|
||||
#if SANITIZER_FREEBSD
|
||||
// FreeBSD's dlopen() returns a pointer to an Obj_Entry structure that
|
||||
// incroporates the map structure.
|
||||
# define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) \
|
||||
((link_map*)((handle) == nullptr ? nullptr : ((char*)(handle) + 544)))
|
||||
#else
|
||||
# define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) ((link_map*)(handle))
|
||||
#endif // !SANITIZER_FREEBSD
|
||||
|
||||
namespace __sanitizer {
|
||||
extern unsigned struct_utsname_sz;
|
||||
extern unsigned struct_stat_sz;
|
||||
|
@ -2232,7 +2232,7 @@ static void HandleRecvmsg(ThreadState *thr, uptr pc,
|
||||
if (fd >= 0) FdClose(thr, pc, fd); \
|
||||
}
|
||||
|
||||
#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, res) \
|
||||
#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, handle) \
|
||||
libignore()->OnLibraryLoaded(filename)
|
||||
|
||||
#define COMMON_INTERCEPTOR_LIBRARY_UNLOADED() \
|
||||
|
Loading…
x
Reference in New Issue
Block a user