On 25.05.2018 09:06, Martin Husemann wrote: > On Fri, May 25, 2018 at 07:39:36AM +0200, Kamil Rytarowski wrote: >> Please test this patch: >> >> http://netbsd.org/~kamil/patch-00048-mmap-munmap-sanitizers.txt >> >> It works for me on amd64 and i386. > > Why do you have to go via dlsym() ? > > Martin > In general: in order to bypass mmap() interceptor. If we call the mmap symbol, it's intercepted by a sanitizer. If and interceptor is not in the interest of a sanitizer or sanitizer-like program/library - we fallback to the default one with RTLD_DEFAULT. In particular: UBSan does not install mmap() interceptor, it's used by other sanitizers like ASan or TSan. The mmap symbol installed by an interceptor is compiled into executable into the .text section and is resolved first, before mmap@PLT. In the particular NetBSD case: we access the __mmap symbol without dlsym(3). In the proposed code, I'm presenting a generic approach to be used for all kernel syscalls used internally in the sanitizers, regardless of being namespaced or not. getpid is a good example of a not namespaced symbol and we want to execute it internally in internal_getpid(). As noted by Joerg, I want to bypass potential cycle with cancel point in libpthread(3) in mmap/_mmap.
Attachment:
signature.asc
Description: OpenPGP digital signature