The branch, master has been updated via 2e0adc7 gitlab-ci: run .gitlab-ci.yml also on branches@metze/uid_wrapper via 465806a gitlab-ci: Add runner with ThreadSanitizer via c2c4339 gitlab-ci: Introduce stages via cacb76a gitlab-ci: Format yml correctly that ymllint is happy via a86fe7e cmake: Disable deepbind if we run with sanitizers via 5541386 cmake: Add -DCMAKE_BUILD_TYPE=ThreadSanitizer via 6d309f8 tests: test socket_wrapper_syscall_{valid,va} interaction using uwrap_fake_socket_wrapper.so via f9aeff7 src/uid_wrapper.c: make use of socket_wrapper_syscall_{valid,va}() via da63f38 src/uid_wrapper.c: export uid_wrapper_syscall_{valid,va}() via 759f431 src/uid_wrapper.c: fix mutex fork handling via 681eb37 src/uid_wrapper.c: check for uid_wrapper related syscall numbers before uid_wrapper_enabled() via 1c7324b src/uid_wrapper.c: force RTLD_NEXT for pthread_create/exit() if available via cf818b5 src/uid_wrapper.c: fix RTLD_NEXT handling for libpthread via 30bbcea src/uid_wrapper.c: Avoid dclose(RTLD_NEXT) via 15627c3 src/uid_wrapper.c: always go through uwrap_bind_symbol_all() protected by pthread_once() via b2dff92 tests: fix data race in test_thread_sync_setreuid.c via 206542f tests: fix locking in test_thread_setuid.c via 9adb464 src/uid_wrapper.c: also log the process name via 1cc448d cmake: Check for getprogname() via fb887e3 src/uid_wrapper.c: remove unused UWRAP_LIBSOCKET and UWRAP_LIBNSL from 6223b58 Add clang-format config file
https://git.samba.org/?p=uid_wrapper.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 2e0adc7a0a6cdfe479a8225aa03d0286a1ef2b96 Author: Stefan Metzmacher <me...@samba.org> Date: Sat Jan 14 11:28:54 2023 +0100 gitlab-ci: run .gitlab-ci.yml also on branches@metze/uid_wrapper Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 465806ac345a1599bb21202d6311b9fddb3f8096 Author: Andreas Schneider <a...@cryptomilk.org> Date: Sat Jan 14 09:39:44 2023 +0100 gitlab-ci: Add runner with ThreadSanitizer Signed-off-by: Andreas Schneider <a...@cryptomilk.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit c2c4339d62ddcc64262681474dd9bc16d3b5dbce Author: Andreas Schneider <a...@cryptomilk.org> Date: Sat Jan 14 09:36:26 2023 +0100 gitlab-ci: Introduce stages Signed-off-by: Andreas Schneider <a...@cryptomilk.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit cacb76add5022583e0db16cb1cce0d2483157a35 Author: Andreas Schneider <a...@cryptomilk.org> Date: Sat Jan 14 09:33:45 2023 +0100 gitlab-ci: Format yml correctly that ymllint is happy Signed-off-by: Andreas Schneider <a...@cryptomilk.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit a86fe7ebb737045cfb90a618a54e4429f6168a08 Author: Andreas Schneider <a...@cryptomilk.org> Date: Sat Jan 14 09:30:17 2023 +0100 cmake: Disable deepbind if we run with sanitizers Signed-off-by: Andreas Schneider <a...@cryptomilk.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 5541386b1ffe7bd5561221c7f1931126fb6586b9 Author: Andreas Schneider <a...@cryptomilk.org> Date: Sat Jan 14 09:21:55 2023 +0100 cmake: Add -DCMAKE_BUILD_TYPE=ThreadSanitizer Signed-off-by: Andreas Schneider <a...@cryptomilk.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 6d309f8b31493766f99d5f288550b1c33100bde8 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 21:41:09 2023 +0100 tests: test socket_wrapper_syscall_{valid,va} interaction using uwrap_fake_socket_wrapper.so Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit f9aeff77b2b2e7776f13239bab548bb5af717f8a Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 11:22:02 2023 +0100 src/uid_wrapper.c: make use of socket_wrapper_syscall_{valid,va}() If we find socket_wrapper_syscall_{valid,va}() symbols in the already loaded libraries, we'll try to hand over syscall() invocations to socket_wrapper. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit da63f387bf85da1ad95b112fb3ef513399b2254c Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 11:42:05 2023 +0100 src/uid_wrapper.c: export uid_wrapper_syscall_{valid,va}() We need to hook into syscall() from uid_wrapper as well as from socket_wrapper() (and maybe others in future). But the assumption is that only one wrapper will take care of a single syscall number. So we provide uid_wrapper_syscall_valid() in order to allow external consumers (e.g. socket_wrapper.so) to check if uid_wrapper wants to handle a specified syscall number. And we provide uid_wrapper_syscall_va() in order to allow calling into uwrap_syscall(). Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 759f4317756b4c70cbf1943ff66a4c714a7e5030 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Nov 8 20:31:35 2022 +0100 src/uid_wrapper.c: fix mutex fork handling We need to use pthread_mutex_init in the child handler... See https://sourceware.org/bugzilla/show_bug.cgi?id=2745 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 681eb371ee03f2f85f50900842b04911fc75e103 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 11:27:32 2023 +0100 src/uid_wrapper.c: check for uid_wrapper related syscall numbers before uid_wrapper_enabled() On FreeBSD syscall() is called after the pthread_atfork() 'prepare' hooks. So we need to avoid calling uid_wrapper_enabled() as it would deadlock. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 1c7324bd295b51cf06e0e8e1e61c494723ff8751 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 15:20:00 2023 +0100 src/uid_wrapper.c: force RTLD_NEXT for pthread_create/exit() if available This is needed as thread sanatizer also overloads pthread_create and pthread_exit(). Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit cf818b501be24bcfcad7157d2eb29f3404c85844 Author: Stefan Metzmacher <me...@samba.org> Date: Fri Jan 13 20:48:25 2023 +0100 src/uid_wrapper.c: fix RTLD_NEXT handling for libpthread BUG: https://bugzilla.samba.org/show_bug.cgi?id=15228 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 30bbcea2b7a142c7e361806f5fdf0e145b915f7d Author: Samuel Thibault <samuel.thiba...@ens-lyon.org> Date: Thu Nov 10 18:34:12 2022 +0000 src/uid_wrapper.c: Avoid dclose(RTLD_NEXT) In case the libc was not found and RTLD_NEXT is used instead, we should not dlclose it, otherwise mayhem happens. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15228 Signed-off-by: Samuel Thibault <samuel.thiba...@ens-lyon.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 15627c333aa250a8a47414847bc6923d21d0a2b7 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Nov 8 20:08:40 2022 +0100 src/uid_wrapper.c: always go through uwrap_bind_symbol_all() protected by pthread_once() BUG: https://bugzilla.samba.org/show_bug.cgi?id=15227 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit b2dff923b6f804efcd95f1d6e88ea340a59f9ae3 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 16:23:36 2023 +0100 tests: fix data race in test_thread_sync_setreuid.c Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 206542fa9d393e851643a27c26fff638780d42f9 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 15:43:21 2023 +0100 tests: fix locking in test_thread_setuid.c Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 9adb464ed062225ea54e64db77d3c85e8b2e5700 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Nov 8 21:30:18 2022 +0100 src/uid_wrapper.c: also log the process name Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 1cc448d515b7a39e04edacbb02fc0dc01a3af493 Author: Andreas Schneider <a...@cryptomilk.org> Date: Sat Jan 14 09:57:13 2023 +0100 cmake: Check for getprogname() Signed-off-by: Andreas Schneider <a...@cryptomilk.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit fb887e36a53f91fd53d3a61e721f8e5d1c03d9fd Author: Stefan Metzmacher <me...@samba.org> Date: Tue Nov 8 20:40:44 2022 +0100 src/uid_wrapper.c: remove unused UWRAP_LIBSOCKET and UWRAP_LIBNSL Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> ----------------------------------------------------------------------- Summary of changes: .gitlab-ci.yml | 231 +++++++------ ConfigureChecks.cmake | 2 + cmake/Modules/DefineCompilerFlags.cmake | 12 + config.h.cmake | 3 + src/uid_wrapper.c | 552 +++++++++++++++++++++++++++----- tests/CMakeLists.txt | 20 ++ tests/test_syscall_swrap.c | 50 +++ tests/test_thread_setuid.c | 21 +- tests/test_thread_sync_setreuid.c | 15 +- tests/uwrap_fake_socket_wrapper.c | 44 +++ tests/uwrap_fake_socket_wrapper.h | 7 + 11 files changed, 775 insertions(+), 182 deletions(-) create mode 100644 tests/test_syscall_swrap.c create mode 100644 tests/uwrap_fake_socket_wrapper.c create mode 100644 tests/uwrap_fake_socket_wrapper.h Changeset truncated at 500 lines: diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0cdb0ea..1a4a3b0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,3 +1,4 @@ +--- variables: GIT_DEPTH: 3 BUILD_IMAGES_PROJECT: cmocka/gitlab-build-images @@ -7,18 +8,24 @@ variables: MINGW_BUILD: buildenv-mingw UBUNTU_BUILD: buildenv-ubuntu +stages: + - build + - test + - analysis + centos7/x86_64: + stage: test image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$CENTOS7_BUILD script: - - mkdir -p obj && cd obj && cmake3 - -DCMAKE_BUILD_TYPE=RelWithDebInfo - -DPICKY_DEVELOPER=ON - -DUNIT_TESTING=ON .. && - make -j$(nproc) && ctest --output-on-failure + - mkdir -p obj && cd obj && cmake3 + -DCMAKE_BUILD_TYPE=RelWithDebInfo + -DPICKY_DEVELOPER=ON + -DUNIT_TESTING=ON .. && + make -j$(nproc) && ctest --output-on-failure tags: - - shared + - shared except: - - tags + - tags artifacts: expire_in: 1 week when: on_failure @@ -26,18 +33,19 @@ centos7/x86_64: - obj/ fedora/x86_64: + stage: test image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD script: - - mkdir -p obj && cd obj && cmake - -DCMAKE_INSTALL_PREFIX=/tmp/local - -DCMAKE_BUILD_TYPE=RelWithDebInfo - -DPICKY_DEVELOPER=ON - -DUNIT_TESTING=ON .. && - make -j$(nproc) && ctest --output-on-failure && make install + - mkdir -p obj && cd obj && cmake + -DCMAKE_INSTALL_PREFIX=/tmp/local + -DCMAKE_BUILD_TYPE=RelWithDebInfo + -DPICKY_DEVELOPER=ON + -DUNIT_TESTING=ON .. && + make -j$(nproc) && ctest --output-on-failure && make install tags: - - shared + - shared except: - - tags + - tags artifacts: expire_in: 1 week when: on_failure @@ -45,17 +53,18 @@ fedora/x86_64: - obj/ fedora/address-sanitizer: + stage: build image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD script: - - mkdir -p obj && cd obj && cmake - -DCMAKE_BUILD_TYPE=AddressSanitizer - -DPICKY_DEVELOPER=ON - -DUNIT_TESTING=ON .. && - make -j$(nproc) && ctest --output-on-failure + - mkdir -p obj && cd obj && cmake + -DCMAKE_BUILD_TYPE=AddressSanitizer + -DPICKY_DEVELOPER=ON + -DUNIT_TESTING=ON .. && + make -j$(nproc) && ctest --output-on-failure tags: - - shared + - shared except: - - tags + - tags artifacts: expire_in: 1 week when: on_failure @@ -63,16 +72,36 @@ fedora/address-sanitizer: - obj/ fedora/undefined-sanitizer: + stage: analysis image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD script: - - mkdir -p obj && cd obj && cmake - -DCMAKE_BUILD_TYPE=UndefinedSanitizer - -DUNIT_TESTING=ON .. - && make -j$(nproc) && ctest --output-on-failure + - mkdir -p obj && cd obj && cmake + -DCMAKE_BUILD_TYPE=UndefinedSanitizer + -DUNIT_TESTING=ON .. + && make -j$(nproc) && ctest --output-on-failure + tags: + - shared + except: + - tags + artifacts: + expire_in: 1 week + when: on_failure + paths: + - obj/ + +fedora/thread-sanitizer: + stage: analysis + image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD + script: + - mkdir -p obj && cd obj && cmake + -DCMAKE_BUILD_TYPE=ThreadSanitizer + -DPICKY_DEVELOPER=ON + -DUNIT_TESTING=ON .. && + make -j$(nproc) && ctest --output-on-failure tags: - - shared + - shared except: - - tags + - tags artifacts: expire_in: 1 week when: on_failure @@ -80,32 +109,33 @@ fedora/undefined-sanitizer: - obj/ fedora/csbuild: + stage: analysis variables: GIT_DEPTH: 20 image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD script: - - | - if [[ -z "$CI_COMMIT_BEFORE_SHA" ]]; then - export CI_COMMIT_BEFORE_SHA=$(git rev-parse "${CI_COMMIT_SHA}~15") - fi - - # Check if the commit exists in this branch - # This is not the case for a force push - git branch --contains $CI_COMMIT_BEFORE_SHA 2>/dev/null || export CI_COMMIT_BEFORE_SHA=$(git rev-parse "${CI_COMMIT_SHA}~15") - - export CI_COMMIT_RANGE="$CI_COMMIT_BEFORE_SHA..$CI_COMMIT_SHA" - - - csbuild - --build-dir=obj-csbuild - --prep-cmd="cmake -DCMAKE_BUILD_TYPE=Debug -DPICKY_DEVELOPER=ON -DUNIT_TESTING=ON @SRCDIR@" - --build-cmd "make clean && make -j$(nproc)" - --git-commit-range $CI_COMMIT_RANGE - --color - --print-current --print-fixed + - | + if [[ -z "$CI_COMMIT_BEFORE_SHA" ]]; then + export CI_COMMIT_BEFORE_SHA=$(git rev-parse "${CI_COMMIT_SHA}~15") + fi + + # Check if the commit exists in this branch + # This is not the case for a force push + git branch --contains $CI_COMMIT_BEFORE_SHA 2>/dev/null || export CI_COMMIT_BEFORE_SHA=$(git rev-parse "${CI_COMMIT_SHA}~15") + + export CI_COMMIT_RANGE="$CI_COMMIT_BEFORE_SHA..$CI_COMMIT_SHA" + + - csbuild + --build-dir=obj-csbuild + --prep-cmd="cmake -DCMAKE_BUILD_TYPE=Debug -DPICKY_DEVELOPER=ON -DUNIT_TESTING=ON @SRCDIR@" + --build-cmd "make clean && make -j$(nproc)" + --git-commit-range $CI_COMMIT_RANGE + --color + --print-current --print-fixed tags: - - shared + - shared except: - - tags + - tags artifacts: expire_in: 1 week when: on_failure @@ -113,20 +143,22 @@ fedora/csbuild: - obj-csbuild/ freebsd/x86_64: + stage: test image: script: - - mkdir -p obj && cd obj && cmake - -DCMAKE_BUILD_TYPE=RelWithDebInfo - -DPICKY_DEVELOPER=ON - -DUNIT_TESTING=ON .. && - make && ctest --output-on-failure + - mkdir -p obj && cd obj && cmake + -DCMAKE_BUILD_TYPE=RelWithDebInfo + -DPICKY_DEVELOPER=ON + -DUNIT_TESTING=ON .. && + make && ctest --output-on-failure tags: - - freebsd + - freebsd except: - - tags + - tags only: - - branches@cwrap/uid_wrapper - - branches@cryptomilk/uid_wrapper + - branches@cwrap/uid_wrapper + - branches@cryptomilk/uid_wrapper + - branches@metze/uid_wrapper artifacts: expire_in: 1 week when: on_failure @@ -134,17 +166,18 @@ freebsd/x86_64: - obj/ tumbleweed/x86_64/gcc: + stage: test image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD script: - - mkdir -p obj && cd obj && cmake - -DCMAKE_BUILD_TYPE=RelWithDebInfo - -DPICKY_DEVELOPER=ON - -DUNIT_TESTING=ON .. && - make -j$(nproc) && ctest --output-on-failure + - mkdir -p obj && cd obj && cmake + -DCMAKE_BUILD_TYPE=RelWithDebInfo + -DPICKY_DEVELOPER=ON + -DUNIT_TESTING=ON .. && + make -j$(nproc) && ctest --output-on-failure tags: - - shared + - shared except: - - tags + - tags artifacts: expire_in: 1 week when: on_failure @@ -152,18 +185,19 @@ tumbleweed/x86_64/gcc: - obj/ tumbleweed/x86_64/gcc7: + stage: test image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD script: - - mkdir -p obj && cd obj && cmake - -DCMAKE_C_COMPILER=gcc-7 -DCMAKE_CXX_COMPILER=g++-7 - -DCMAKE_BUILD_TYPE=RelWithDebInfo - -DPICKY_DEVELOPER=ON - -DUNIT_TESTING=ON .. && - make -j$(nproc) && ctest --output-on-failure + - mkdir -p obj && cd obj && cmake + -DCMAKE_C_COMPILER=gcc-7 -DCMAKE_CXX_COMPILER=g++-7 + -DCMAKE_BUILD_TYPE=RelWithDebInfo + -DPICKY_DEVELOPER=ON + -DUNIT_TESTING=ON .. && + make -j$(nproc) && ctest --output-on-failure tags: - - shared + - shared except: - - tags + - tags artifacts: expire_in: 1 week when: on_failure @@ -171,18 +205,19 @@ tumbleweed/x86_64/gcc7: - obj/ tumbleweed/x86_64/clang: + stage: test image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD script: - - mkdir -p obj && cd obj && cmake - -DCMAKE_BUILD_TYPE=RelWithDebInfo - -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ - -DPICKY_DEVELOPER=ON - -DUNIT_TESTING=ON .. && - make -j$(nproc) && ctest --output-on-failure + - mkdir -p obj && cd obj && cmake + -DCMAKE_BUILD_TYPE=RelWithDebInfo + -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ + -DPICKY_DEVELOPER=ON + -DUNIT_TESTING=ON .. && + make -j$(nproc) && ctest --output-on-failure tags: - - shared + - shared except: - - tags + - tags artifacts: expire_in: 1 week when: on_failure @@ -190,20 +225,21 @@ tumbleweed/x86_64/clang: - obj/ tumbleweed/static-analysis: + stage: analysis image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD script: - - export CCC_CC=clang - - export CCC_CXX=clang++ - - mkdir -p obj && cd obj && scan-build cmake - -DCMAKE_BUILD_TYPE=Debug - -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ - -DPICKY_DEVELOPER=ON - -DUNIT_TESTING=ON .. && - scan-build --status-bugs -o scan make -j$(nproc) + - export CCC_CC=clang + - export CCC_CXX=clang++ + - mkdir -p obj && cd obj && scan-build cmake + -DCMAKE_BUILD_TYPE=Debug + -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ + -DPICKY_DEVELOPER=ON + -DUNIT_TESTING=ON .. && + scan-build --status-bugs -o scan make -j$(nproc) tags: - - shared + - shared except: - - tags + - tags artifacts: expire_in: 1 week when: on_failure @@ -211,17 +247,18 @@ tumbleweed/static-analysis: - obj/scan ubuntu/x86_64: + stage: test image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$UBUNTU_BUILD script: - - mkdir -p obj && cd obj && cmake - -DCMAKE_BUILD_TYPE=RelWithDebInfo - -DPICKY_DEVELOPER=ON - -DUNIT_TESTING=ON .. && - make -j$(nproc) && ctest --output-on-failure + - mkdir -p obj && cd obj && cmake + -DCMAKE_BUILD_TYPE=RelWithDebInfo + -DPICKY_DEVELOPER=ON + -DUNIT_TESTING=ON .. && + make -j$(nproc) && ctest --output-on-failure tags: - - shared + - shared except: - - tags + - tags artifacts: expire_in: 1 week when: on_failure diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake index e299f6e..3201131 100644 --- a/ConfigureChecks.cmake +++ b/ConfigureChecks.cmake @@ -68,6 +68,8 @@ check_function_exists(getgroups HAVE_GETGROUPS) check_function_exists(__getgroups_chk HAVE___GETGROUPS_CHK) check_function_exists(setgroups HAVE_SETGROUPS) +check_function_exists(getprogname HAVE_GETPROGNAME) + if (HAVE_SETGROUPS) check_prototype_definition(setgroups "int setgroups(int size, const gid_t *list)" diff --git a/cmake/Modules/DefineCompilerFlags.cmake b/cmake/Modules/DefineCompilerFlags.cmake index 3277b99..c92182d 100644 --- a/cmake/Modules/DefineCompilerFlags.cmake +++ b/cmake/Modules/DefineCompilerFlags.cmake @@ -34,4 +34,16 @@ if (UNIX AND NOT WIN32) CACHE STRING "Flags used by the linker during the creation of shared libraries during UNDEFINEDSANITIZER builds.") set(CMAKE_EXEC_LINKER_FLAGS_UNDEFINEDSANITIZER "-fsanitize=undefined" CACHE STRING "Flags used by the linker during UNDEFINEDSANITIZER builds.") + + # Activate with: -DCMAKE_BUILD_TYPE=ThreadSanitizer + set(CMAKE_C_FLAGS_THREADSANITIZER "-g -O1 -fsanitize=thread" + CACHE STRING "Flags used by the C compiler during THREADSANITIZER builds.") + set(CMAKE_CXX_FLAGS_THREADSANITIZER "-g -O1 -fsanitize=thread" + CACHE STRING "Flags used by the CXX compiler during THREADSANITIZER builds.") + set(CMAKE_SHARED_LINKER_FLAGS_THREADSANITIZER "-fsanitize=thread" + CACHE STRING "Flags used by the linker during the creation of shared libraries during THREADSANITIZER builds.") + set(CMAKE_MODULE_LINKER_FLAGS_THREADSANITIZER "-fsanitize=thread" + CACHE STRING "Flags used by the linker during the creation of shared libraries during THREADSANITIZER builds.") + set(CMAKE_EXEC_LINKER_FLAGS_THREADSANITIZER "-fsanitize=thread" + CACHE STRING "Flags used by the linker during THREADSANITIZER builds.") endif() diff --git a/config.h.cmake b/config.h.cmake index 5b342e3..dde70ec 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -53,6 +53,9 @@ #cmakedefine HAVE_SYSCALL 1 #cmakedefine HAVE_SYSCALL_INT 1 +/* Define to 1 if you have the `getprogname' function. */ +#cmakedefine HAVE_GETPROGNAME 1 + /*************************** LIBRARIES ***************************/ /**************************** OPTIONS ****************************/ diff --git a/src/uid_wrapper.c b/src/uid_wrapper.c index f04642a..5b6a82b 100644 --- a/src/uid_wrapper.c +++ b/src/uid_wrapper.c @@ -44,25 +44,6 @@ # define UWRAP_THREAD #endif -# define UWRAP_LOCK(m) do { \ - pthread_mutex_lock(&( m ## _mutex)); \ -} while(0) - -# define UWRAP_UNLOCK(m) do { \ - pthread_mutex_unlock(&( m ## _mutex)); \ -} while(0) - -/* Add new global locks here please */ -# define UWRAP_LOCK_ALL \ - UWRAP_LOCK(uwrap_id); \ - UWRAP_LOCK(libc_symbol_binding); \ - UWRAP_LOCK(libpthread_symbol_binding) - -# define UWRAP_UNLOCK_ALL \ - UWRAP_UNLOCK(libpthread_symbol_binding); \ - UWRAP_UNLOCK(libc_symbol_binding); \ - UWRAP_UNLOCK(uwrap_id) - #ifdef HAVE_CONSTRUCTOR_ATTRIBUTE #define CONSTRUCTOR_ATTRIBUTE __attribute__ ((constructor)) #else @@ -142,6 +123,19 @@ enum uwrap_dbglvl_e { UWRAP_LOG_TRACE }; +#ifndef HAVE_GETPROGNAME +static const char *getprogname(void) +{ +#if defined(HAVE_PROGRAM_INVOCATION_SHORT_NAME) + return program_invocation_short_name; +#elif defined(HAVE_GETEXECNAME) + return getexecname(); +#else + return NULL; +#endif /* HAVE_PROGRAM_INVOCATION_SHORT_NAME */ +} +#endif /* HAVE_GETPROGNAME */ + static void uwrap_log(enum uwrap_dbglvl_e dbglvl, const char *function, const char *format, ...) PRINTF_ATTRIBUTE(3, 4); # define UWRAP_LOG(dbglvl, ...) uwrap_log((dbglvl), __func__, __VA_ARGS__) @@ -152,6 +146,7 @@ static void uwrap_log(enum uwrap_dbglvl_e dbglvl, const char *function, const ch const char *d; unsigned int lvl = 0; const char *prefix = "UWRAP"; + const char *progname = getprogname(); d = getenv("UID_WRAPPER_DEBUGLEVEL"); if (d != NULL) { @@ -181,9 +176,14 @@ static void uwrap_log(enum uwrap_dbglvl_e dbglvl, const char *function, const ch break; } + if (progname == NULL) { + progname = "<unknown>"; + } + fprintf(stderr, - "%s(%d) - %s: %s\n", + "%s[%s (%u)] - %s: %s\n", prefix, + progname, (int)getpid(), function, buffer); @@ -298,6 +298,28 @@ struct uwrap_libc_symbols { }; #undef UWRAP_SYMBOL_ENTRY +#define UWRAP_SYMBOL_ENTRY(i) \ + union { \ + __rtld_default_##i f; \ + void *obj; \ + } _rtld_default_##i + +#ifdef HAVE_SYSCALL +typedef bool (*__rtld_default_socket_wrapper_syscall_valid)(long int sysno); +typedef long int (*__rtld_default_socket_wrapper_syscall_va)(long int sysno, + va_list va); -- UID Wrapper Repository