Skip to content

Commit

Permalink
gcc: re-enable libsanitizer (#8089)
Browse files Browse the repository at this point in the history
  • Loading branch information
anphel31 authored Feb 28, 2024
1 parent 6647ae8 commit 0e84a68
Show file tree
Hide file tree
Showing 6 changed files with 190 additions and 47 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
From 9b116160a1482c5c0c199f9c21d78a527d11d9ea Mon Sep 17 00:00:00 2001
From: Fangrui Song <i@maskray.me>
Date: Fri, 28 Apr 2023 09:59:17 -0700
Subject: [PATCH] Remove crypt and crypt_r interceptors

From Florian Weimer's D144073

> On GNU/Linux (glibc), the crypt and crypt_r functions are not part of the main shared object (libc.so.6), but libcrypt (with multiple possible sonames). The sanitizer libraries do not depend on libcrypt, so it can happen that during sanitizer library initialization, no real implementation will be found because the crypt, crypt_r functions are not present in the process image (yet). If its interceptors are called nevertheless, this results in a call through a null pointer when the sanitizer library attempts to forward the call to the real implementation.
>
> Many distributions have already switched to libxcrypt, a library that is separate from glibc and that can be build with sanitizers directly (avoiding the need for interceptors). This patch disables building the interceptor for glibc targets.

Let's remove crypt and crypt_r interceptors (D68431) to fix issues with
newer glibc.

For older glibc, msan will not know that an uninstrumented crypt_r call
initializes `data`, so there is a risk for false positives. However, with some
codebase survey, I think crypt_r uses are very few and the call sites typically
have a `memset(&data, 0, sizeof(data));` anyway.

Fix https://github.com/google/sanitizers/issues/1365
Related: https://bugzilla.redhat.com/show_bug.cgi?id=2169432

Reviewed By: #sanitizers, fweimer, thesamesam, vitalybuka

Differential Revision: https://reviews.llvm.org/D149403
---
.../sanitizer_common_interceptors.inc | 37 -------------------
.../sanitizer_platform_interceptors.h | 2 -
.../sanitizer_platform_limits_posix.cpp | 8 ----
.../sanitizer_platform_limits_posix.h | 1 -
4 files changed, 48 deletions(-)

diff --git a/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc b/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc
index ba4b80081f0f..662c41997422 100644
--- a/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc
@@ -10187,41 +10187,6 @@ INTERCEPTOR(SSIZE_T, getrandom, void *buf, SIZE_T buflen, unsigned int flags) {
#define INIT_GETRANDOM
#endif

-#if SANITIZER_INTERCEPT_CRYPT
-INTERCEPTOR(char *, crypt, char *key, char *salt) {
- void *ctx;
- COMMON_INTERCEPTOR_ENTER(ctx, crypt, key, salt);
- COMMON_INTERCEPTOR_READ_RANGE(ctx, key, internal_strlen(key) + 1);
- COMMON_INTERCEPTOR_READ_RANGE(ctx, salt, internal_strlen(salt) + 1);
- char *res = REAL(crypt)(key, salt);
- if (res != nullptr)
- COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, internal_strlen(res) + 1);
- return res;
-}
-#define INIT_CRYPT COMMON_INTERCEPT_FUNCTION(crypt);
-#else
-#define INIT_CRYPT
-#endif
-
-#if SANITIZER_INTERCEPT_CRYPT_R
-INTERCEPTOR(char *, crypt_r, char *key, char *salt, void *data) {
- void *ctx;
- COMMON_INTERCEPTOR_ENTER(ctx, crypt_r, key, salt, data);
- COMMON_INTERCEPTOR_READ_RANGE(ctx, key, internal_strlen(key) + 1);
- COMMON_INTERCEPTOR_READ_RANGE(ctx, salt, internal_strlen(salt) + 1);
- char *res = REAL(crypt_r)(key, salt, data);
- if (res != nullptr) {
- COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data,
- __sanitizer::struct_crypt_data_sz);
- COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, internal_strlen(res) + 1);
- }
- return res;
-}
-#define INIT_CRYPT_R COMMON_INTERCEPT_FUNCTION(crypt_r);
-#else
-#define INIT_CRYPT_R
-#endif
-
#if SANITIZER_INTERCEPT_GETENTROPY
INTERCEPTOR(int, getentropy, void *buf, SIZE_T buflen) {
void *ctx;
@@ -10772,8 +10737,6 @@ static void InitializeCommonInterceptors() {
INIT_GETUSERSHELL;
INIT_SL_INIT;
INIT_GETRANDOM;
- INIT_CRYPT;
- INIT_CRYPT_R;
INIT_GETENTROPY;
INIT_QSORT;
INIT_QSORT_R;
diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h b/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h
index 8307b1ec28bf..d50166ee6ce0 100644
--- a/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h
+++ b/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h
@@ -571,8 +571,6 @@
#define SANITIZER_INTERCEPT_FDEVNAME SI_FREEBSD
#define SANITIZER_INTERCEPT_GETUSERSHELL (SI_POSIX && !SI_ANDROID)
#define SANITIZER_INTERCEPT_SL_INIT (SI_FREEBSD || SI_NETBSD)
-#define SANITIZER_INTERCEPT_CRYPT (SI_POSIX && !SI_ANDROID)
-#define SANITIZER_INTERCEPT_CRYPT_R (SI_LINUX && !SI_ANDROID)

#define SANITIZER_INTERCEPT_GETRANDOM \
((SI_LINUX && __GLIBC_PREREQ(2, 25)) || SI_FREEBSD)
diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
index c85cf1626a75..bcbd143d19de 100644
--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -176,10 +176,6 @@ typedef struct user_fpregs elf_fpregset_t;
# include "sanitizer_platform_interceptors.h"
# include "sanitizer_platform_limits_posix.h"

-#if SANITIZER_INTERCEPT_CRYPT_R
-#include <crypt.h>
-#endif
-
namespace __sanitizer {
unsigned struct_utsname_sz = sizeof(struct utsname);
unsigned struct_stat_sz = sizeof(struct stat);
@@ -283,10 +279,6 @@ namespace __sanitizer {
unsigned struct_statvfs64_sz = sizeof(struct statvfs64);
#endif // SANITIZER_LINUX && !SANITIZER_ANDROID

-#if SANITIZER_INTERCEPT_CRYPT_R
- unsigned struct_crypt_data_sz = sizeof(struct crypt_data);
-#endif
-
#if SANITIZER_LINUX && !SANITIZER_ANDROID
unsigned struct_timex_sz = sizeof(struct timex);
unsigned struct_msqid_ds_sz = sizeof(struct msqid_ds);
diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
index 44dd3d9e22d1..29ebb304a9ba 100644
--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -319,7 +319,6 @@ extern unsigned struct_msqid_ds_sz;
extern unsigned struct_mq_attr_sz;
extern unsigned struct_timex_sz;
extern unsigned struct_statvfs_sz;
-extern unsigned struct_crypt_data_sz;
#endif // SANITIZER_LINUX && !SANITIZER_ANDROID

struct __sanitizer_iovec {
--
2.41.0
7 changes: 5 additions & 2 deletions SPECS/gcc/gcc.spec
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,15 @@
Summary: Contains the GNU compiler collection
Name: gcc
Version: 13.2.0
Release: 2%{?dist}
Release: 3%{?dist}
License: GPLv2+
Vendor: Microsoft Corporation
Distribution: Azure Linux
Group: Development/Tools
URL: https://gcc.gnu.org/
Source0: https://ftp.gnu.org/gnu/gcc/%{name}-%{version}/%{name}-%{version}.tar.xz
#Patch0: CVE-2023-4039.patch
Patch1: 0011-libsanitizer-Remove-crypt-and-crypt_r-interceptors.patch

BuildRequires: gmp-devel
BuildRequires: mpfr-devel
Expand Down Expand Up @@ -318,7 +319,6 @@ LD=ld \
%configure \
--disable-bootstrap \
--disable-fixincludes \
--disable-libsanitizer \
--disable-multilib \
--enable-__cxa_atexit \
--enable-clocale=gnu \
Expand Down Expand Up @@ -523,6 +523,9 @@ $tests_ok
%do_files aarch64-linux-gnu %{build_cross}

%changelog
* Mon Feb 26 2024 Andrew Phelps <anphel@microsoft.com> - 13.2.0-3
- Re-enable libsanitizer

* Mon Dec 11 2023 Pawel Winogrodzki <pawelwi@microsoft.com> - 13.2.0-2
- Added cross-compilation support for aarch64.
- Used Fedora 36 spec (license: MIT) for guidance.
Expand Down
18 changes: 9 additions & 9 deletions toolkit/resources/manifests/package/pkggen_core_aarch64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ mpfr-4.2.1-1.azl3.aarch64.rpm
mpfr-devel-4.2.1-1.azl3.aarch64.rpm
libmetalink-0.1.3-1.azl3.aarch64.rpm
libmpc-1.3.1-1.azl3.aarch64.rpm
libgcc-13.2.0-2.azl3.aarch64.rpm
libgcc-atomic-13.2.0-2.azl3.aarch64.rpm
libgcc-devel-13.2.0-2.azl3.aarch64.rpm
libstdc++-13.2.0-2.azl3.aarch64.rpm
libstdc++-devel-13.2.0-2.azl3.aarch64.rpm
libgomp-13.2.0-2.azl3.aarch64.rpm
libgomp-devel-13.2.0-2.azl3.aarch64.rpm
gcc-13.2.0-2.azl3.aarch64.rpm
gcc-c++-13.2.0-2.azl3.aarch64.rpm
libgcc-13.2.0-3.azl3.aarch64.rpm
libgcc-atomic-13.2.0-3.azl3.aarch64.rpm
libgcc-devel-13.2.0-3.azl3.aarch64.rpm
libstdc++-13.2.0-3.azl3.aarch64.rpm
libstdc++-devel-13.2.0-3.azl3.aarch64.rpm
libgomp-13.2.0-3.azl3.aarch64.rpm
libgomp-devel-13.2.0-3.azl3.aarch64.rpm
gcc-13.2.0-3.azl3.aarch64.rpm
gcc-c++-13.2.0-3.azl3.aarch64.rpm
libpkgconf-2.0.2-1.azl3.aarch64.rpm
pkgconf-2.0.2-1.azl3.aarch64.rpm
pkgconf-m4-2.0.2-1.azl3.noarch.rpm
Expand Down
18 changes: 9 additions & 9 deletions toolkit/resources/manifests/package/pkggen_core_x86_64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ mpfr-4.2.1-1.azl3.x86_64.rpm
mpfr-devel-4.2.1-1.azl3.x86_64.rpm
libmetalink-0.1.3-1.azl3.x86_64.rpm
libmpc-1.3.1-1.azl3.x86_64.rpm
libgcc-13.2.0-2.azl3.x86_64.rpm
libgcc-atomic-13.2.0-2.azl3.x86_64.rpm
libgcc-devel-13.2.0-2.azl3.x86_64.rpm
libstdc++-13.2.0-2.azl3.x86_64.rpm
libstdc++-devel-13.2.0-2.azl3.x86_64.rpm
libgomp-13.2.0-2.azl3.x86_64.rpm
libgomp-devel-13.2.0-2.azl3.x86_64.rpm
gcc-13.2.0-2.azl3.x86_64.rpm
gcc-c++-13.2.0-2.azl3.x86_64.rpm
libgcc-13.2.0-3.azl3.x86_64.rpm
libgcc-atomic-13.2.0-3.azl3.x86_64.rpm
libgcc-devel-13.2.0-3.azl3.x86_64.rpm
libstdc++-13.2.0-3.azl3.x86_64.rpm
libstdc++-devel-13.2.0-3.azl3.x86_64.rpm
libgomp-13.2.0-3.azl3.x86_64.rpm
libgomp-devel-13.2.0-3.azl3.x86_64.rpm
gcc-13.2.0-3.azl3.x86_64.rpm
gcc-c++-13.2.0-3.azl3.x86_64.rpm
libpkgconf-2.0.2-1.azl3.x86_64.rpm
pkgconf-2.0.2-1.azl3.x86_64.rpm
pkgconf-m4-2.0.2-1.azl3.noarch.rpm
Expand Down
24 changes: 12 additions & 12 deletions toolkit/resources/manifests/package/toolchain_aarch64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -91,16 +91,16 @@ flex-debuginfo-2.6.4-7.azl3.aarch64.rpm
flex-devel-2.6.4-7.azl3.aarch64.rpm
gawk-5.2.2-1.azl3.aarch64.rpm
gawk-debuginfo-5.2.2-1.azl3.aarch64.rpm
gcc-13.2.0-2.azl3.aarch64.rpm
gcc-c++-13.2.0-2.azl3.aarch64.rpm
gcc-debuginfo-13.2.0-2.azl3.aarch64.rpm
gcc-13.2.0-3.azl3.aarch64.rpm
gcc-c++-13.2.0-3.azl3.aarch64.rpm
gcc-debuginfo-13.2.0-3.azl3.aarch64.rpm
gdbm-1.23-1.azl3.aarch64.rpm
gdbm-debuginfo-1.23-1.azl3.aarch64.rpm
gdbm-devel-1.23-1.azl3.aarch64.rpm
gdbm-lang-1.23-1.azl3.aarch64.rpm
gettext-0.22-1.azl3.aarch64.rpm
gettext-debuginfo-0.22-1.azl3.aarch64.rpm
gfortran-13.2.0-2.azl3.aarch64.rpm
gfortran-13.2.0-3.azl3.aarch64.rpm
glib-2.78.1-1.azl3.aarch64.rpm
glib-debuginfo-2.78.1-1.azl3.aarch64.rpm
glib-devel-2.78.1-1.azl3.aarch64.rpm
Expand Down Expand Up @@ -150,7 +150,7 @@ libarchive-devel-3.7.1-1.azl3.aarch64.rpm
libassuan-2.5.6-1.azl3.aarch64.rpm
libassuan-debuginfo-2.5.6-1.azl3.aarch64.rpm
libassuan-devel-2.5.6-1.azl3.aarch64.rpm
libbacktrace-static-13.2.0-2.azl3.aarch64.rpm
libbacktrace-static-13.2.0-3.azl3.aarch64.rpm
libcap-2.69-1.azl3.aarch64.rpm
libcap-debuginfo-2.69-1.azl3.aarch64.rpm
libcap-devel-2.69-1.azl3.aarch64.rpm
Expand All @@ -160,14 +160,14 @@ libcap-ng-devel-0.8.3-1.azl3.aarch64.rpm
libffi-3.4.4-1.azl3.aarch64.rpm
libffi-debuginfo-3.4.4-1.azl3.aarch64.rpm
libffi-devel-3.4.4-1.azl3.aarch64.rpm
libgcc-13.2.0-2.azl3.aarch64.rpm
libgcc-atomic-13.2.0-2.azl3.aarch64.rpm
libgcc-devel-13.2.0-2.azl3.aarch64.rpm
libgcc-13.2.0-3.azl3.aarch64.rpm
libgcc-atomic-13.2.0-3.azl3.aarch64.rpm
libgcc-devel-13.2.0-3.azl3.aarch64.rpm
libgcrypt-1.10.2-1.azl3.aarch64.rpm
libgcrypt-debuginfo-1.10.2-1.azl3.aarch64.rpm
libgcrypt-devel-1.10.2-1.azl3.aarch64.rpm
libgomp-13.2.0-2.azl3.aarch64.rpm
libgomp-devel-13.2.0-2.azl3.aarch64.rpm
libgomp-13.2.0-3.azl3.aarch64.rpm
libgomp-devel-13.2.0-3.azl3.aarch64.rpm
libgpg-error-1.47-1.azl3.aarch64.rpm
libgpg-error-debuginfo-1.47-1.azl3.aarch64.rpm
libgpg-error-devel-1.47-1.azl3.aarch64.rpm
Expand Down Expand Up @@ -206,8 +206,8 @@ libsolv-tools-0.7.28-1.azl3.aarch64.rpm
libssh2-1.11.0-1.azl3.aarch64.rpm
libssh2-debuginfo-1.11.0-1.azl3.aarch64.rpm
libssh2-devel-1.11.0-1.azl3.aarch64.rpm
libstdc++-13.2.0-2.azl3.aarch64.rpm
libstdc++-devel-13.2.0-2.azl3.aarch64.rpm
libstdc++-13.2.0-3.azl3.aarch64.rpm
libstdc++-devel-13.2.0-3.azl3.aarch64.rpm
libtasn1-4.19.0-1.azl3.aarch64.rpm
libtasn1-debuginfo-4.19.0-1.azl3.aarch64.rpm
libtasn1-devel-4.19.0-1.azl3.aarch64.rpm
Expand Down
30 changes: 15 additions & 15 deletions toolkit/resources/manifests/package/toolchain_x86_64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ createrepo_c-1.0.3-1.azl3.x86_64.rpm
createrepo_c-debuginfo-1.0.3-1.azl3.x86_64.rpm
createrepo_c-devel-1.0.3-1.azl3.x86_64.rpm
cross-binutils-common-2.41-2.azl3.noarch.rpm
cross-gcc-common-13.2.0-2.azl3.noarch.rpm
cross-gcc-common-13.2.0-3.azl3.noarch.rpm
curl-8.5.0-1.azl3.x86_64.rpm
curl-debuginfo-8.5.0-1.azl3.x86_64.rpm
curl-devel-8.5.0-1.azl3.x86_64.rpm
Expand Down Expand Up @@ -94,18 +94,18 @@ flex-debuginfo-2.6.4-7.azl3.x86_64.rpm
flex-devel-2.6.4-7.azl3.x86_64.rpm
gawk-5.2.2-1.azl3.x86_64.rpm
gawk-debuginfo-5.2.2-1.azl3.x86_64.rpm
gcc-13.2.0-2.azl3.x86_64.rpm
gcc-aarch64-linux-gnu-13.2.0-2.azl3.x86_64.rpm
gcc-c++-13.2.0-2.azl3.x86_64.rpm
gcc-c++-aarch64-linux-gnu-13.2.0-2.azl3.x86_64.rpm
gcc-debuginfo-13.2.0-2.azl3.x86_64.rpm
gcc-13.2.0-3.azl3.x86_64.rpm
gcc-aarch64-linux-gnu-13.2.0-3.azl3.x86_64.rpm
gcc-c++-13.2.0-3.azl3.x86_64.rpm
gcc-c++-aarch64-linux-gnu-13.2.0-3.azl3.x86_64.rpm
gcc-debuginfo-13.2.0-3.azl3.x86_64.rpm
gdbm-1.23-1.azl3.x86_64.rpm
gdbm-debuginfo-1.23-1.azl3.x86_64.rpm
gdbm-devel-1.23-1.azl3.x86_64.rpm
gdbm-lang-1.23-1.azl3.x86_64.rpm
gettext-0.22-1.azl3.x86_64.rpm
gettext-debuginfo-0.22-1.azl3.x86_64.rpm
gfortran-13.2.0-2.azl3.x86_64.rpm
gfortran-13.2.0-3.azl3.x86_64.rpm
glib-2.78.1-1.azl3.x86_64.rpm
glib-debuginfo-2.78.1-1.azl3.x86_64.rpm
glib-devel-2.78.1-1.azl3.x86_64.rpm
Expand Down Expand Up @@ -156,7 +156,7 @@ libarchive-devel-3.7.1-1.azl3.x86_64.rpm
libassuan-2.5.6-1.azl3.x86_64.rpm
libassuan-debuginfo-2.5.6-1.azl3.x86_64.rpm
libassuan-devel-2.5.6-1.azl3.x86_64.rpm
libbacktrace-static-13.2.0-2.azl3.x86_64.rpm
libbacktrace-static-13.2.0-3.azl3.x86_64.rpm
libcap-2.69-1.azl3.x86_64.rpm
libcap-debuginfo-2.69-1.azl3.x86_64.rpm
libcap-devel-2.69-1.azl3.x86_64.rpm
Expand All @@ -166,14 +166,14 @@ libcap-ng-devel-0.8.3-1.azl3.x86_64.rpm
libffi-3.4.4-1.azl3.x86_64.rpm
libffi-debuginfo-3.4.4-1.azl3.x86_64.rpm
libffi-devel-3.4.4-1.azl3.x86_64.rpm
libgcc-13.2.0-2.azl3.x86_64.rpm
libgcc-atomic-13.2.0-2.azl3.x86_64.rpm
libgcc-devel-13.2.0-2.azl3.x86_64.rpm
libgcc-13.2.0-3.azl3.x86_64.rpm
libgcc-atomic-13.2.0-3.azl3.x86_64.rpm
libgcc-devel-13.2.0-3.azl3.x86_64.rpm
libgcrypt-1.10.2-1.azl3.x86_64.rpm
libgcrypt-debuginfo-1.10.2-1.azl3.x86_64.rpm
libgcrypt-devel-1.10.2-1.azl3.x86_64.rpm
libgomp-13.2.0-2.azl3.x86_64.rpm
libgomp-devel-13.2.0-2.azl3.x86_64.rpm
libgomp-13.2.0-3.azl3.x86_64.rpm
libgomp-devel-13.2.0-3.azl3.x86_64.rpm
libgpg-error-1.47-1.azl3.x86_64.rpm
libgpg-error-debuginfo-1.47-1.azl3.x86_64.rpm
libgpg-error-devel-1.47-1.azl3.x86_64.rpm
Expand Down Expand Up @@ -212,8 +212,8 @@ libsolv-tools-0.7.28-1.azl3.x86_64.rpm
libssh2-1.11.0-1.azl3.x86_64.rpm
libssh2-debuginfo-1.11.0-1.azl3.x86_64.rpm
libssh2-devel-1.11.0-1.azl3.x86_64.rpm
libstdc++-13.2.0-2.azl3.x86_64.rpm
libstdc++-devel-13.2.0-2.azl3.x86_64.rpm
libstdc++-13.2.0-3.azl3.x86_64.rpm
libstdc++-devel-13.2.0-3.azl3.x86_64.rpm
libtasn1-4.19.0-1.azl3.x86_64.rpm
libtasn1-debuginfo-4.19.0-1.azl3.x86_64.rpm
libtasn1-devel-4.19.0-1.azl3.x86_64.rpm
Expand Down

0 comments on commit 0e84a68

Please sign in to comment.