Index: lib/libthr/Makefile =================================================================== --- lib/libthr/Makefile +++ lib/libthr/Makefile @@ -68,6 +68,11 @@ .endif .if !defined(NO_PIC) SYMLINKS+=lib${LIB}.so ${LIBDIR}/libpthread.so +beforeinstall: + if ${NM} -u ${SHLIB_NAME_FULL} | grep ' mem'; then \ + echo "Found interposable call to memory function: "; \ + ${NM} -u ${SHLIB_NAME_FULL} | grep ' mem'; false; \ + fi .endif .if ${MK_PROFILE} != "no" SYMLINKS+=lib${LIB}_p.a ${LIBDIR}/libpthread_p.a Index: lib/libthr/thread/Makefile.inc =================================================================== --- lib/libthr/thread/Makefile.inc +++ lib/libthr/thread/Makefile.inc @@ -30,6 +30,7 @@ thr_list.c \ thr_kern.c \ thr_kill.c \ + thr_libcdeps.c \ thr_main_np.c \ thr_malloc.c \ thr_multi_np.c \ @@ -59,3 +60,7 @@ thr_symbols.c \ thr_umtx.c \ thr_yield.c + +# Avoid interposable function calls to memcpy(), etc. to avoid crashes when +# running applications linked with sanitizers. +SHARED_CFLAGS+=-DAVOID_INTERPOSABLE_LIBC_FUNCTIONS Index: lib/libthr/thread/thr_libcdeps.c =================================================================== --- /dev/null +++ lib/libthr/thread/thr_libcdeps.c @@ -0,0 +1,59 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright 2020 Alex Richardson + * + * This software was developed by SRI International and the University of + * Cambridge Computer Laboratory (Department of Computer Science and + * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the + * DARPA SSITH research programme. + * + * This work was supported by Innovate UK project 105694, "Digital Security by + * Design (DSbD) Technology Platform Prototype". + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef AVOID_INTERPOSABLE_LIBC_FUNCTIONS +#include +#include + +void *memcpy(void *, const void *, size_t) __hidden; +void *memmove(void *, const void *, size_t) __hidden; +void *memset(void *, int, size_t) __hidden; + +/* + * This file exists to avoid interposable calls to libc functions inside + * functions that are intercepted by sanitizer runtimes. One example where we + * need to avoid interposable function calls is the copy of the ucontext_t + * argument in handle_signal() as this results in crashes when linking + * applications with ThreadSanitizer. Another example is the libthr-internal + * allocator that calls memset and memcpy. With interposable function calls + * ThreadSanitizer reports false-positive race conditions since the locks + * guarding the allocation functions cannot be seen by the TSan runtime. + * + * Note: This file is only needed for the shared library build. + */ +#include "../../libc/string/memmove.c" +__strong_reference(memmove, memcpy); +#undef wsize +#include "../../libc/string/memset.c" + +#endif