mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-07 07:26:13 -05:00
gnu: clang-cling-runtime: Fix build.
New patches were applied to clang-runtime only, not the whole LLVM base source, hence they were not applied to the cling variants. * gnu/packages/llvm.scm (llvm-cling) [source]: Add clang-cling-runtime-13-glibc-2.36-compat.patch and clang-cling-13-remove-crypt-interceptors.patch patches. * gnu/packages/patches/clang-cling-13-remove-crypt-interceptors.patch: New file. * gnu/packages/patches/clang-cling-runtime-13-glibc-2.36-compat.patch: New file. * gnu/local.mk (dist_patch_DATA): Register them. Change-Id: I4c5ee5f65b2bc04935865ad8e67bc2c3833da2eb
This commit is contained in:
parent
e85f52e826
commit
0feeac35cb
4 changed files with 270 additions and 1 deletions
|
@ -1071,6 +1071,8 @@ dist_patch_DATA = \
|
|||
%D%/packages/patches/clang-17.0-link-dsymutil-latomic.patch \
|
||||
%D%/packages/patches/clang-18.0-libc-search-path.patch \
|
||||
%D%/packages/patches/clang-cling-13-libc-search-path.patch \
|
||||
%D%/packages/patches/clang-cling-13-remove-crypt-interceptors.patch \
|
||||
%D%/packages/patches/clang-cling-runtime-13-glibc-2.36-compat.patch \
|
||||
%D%/packages/patches/clang-runtime-asan-build-fixes.patch \
|
||||
%D%/packages/patches/clang-runtime-esan-build-fixes.patch \
|
||||
%D%/packages/patches/clang-runtime-13-glibc-2.36-compat.patch \
|
||||
|
|
|
@ -2301,7 +2301,10 @@ (define llvm-cling
|
|||
(sha256
|
||||
(base32
|
||||
"1zh6yp8px9hla7v9i67a6anbph140f8ixxbsz65aj7fizksjs1h3"))
|
||||
(patches (search-patches "clang-cling-13-libc-search-path.patch")))))))
|
||||
(patches (search-patches
|
||||
"clang-cling-13-libc-search-path.patch"
|
||||
"clang-cling-runtime-13-glibc-2.36-compat.patch"
|
||||
"clang-cling-13-remove-crypt-interceptors.patch")))))))
|
||||
|
||||
(define clang-cling-runtime
|
||||
(let ((base clang-runtime-13))
|
||||
|
|
|
@ -0,0 +1,214 @@
|
|||
From d7bead833631486e337e541e692d9b4a1ca14edd Mon Sep 17 00:00:00 2001
|
||||
From: Fangrui Song <i@maskray.me>
|
||||
Date: Fri, 28 Apr 2023 09:59:17 -0700
|
||||
Subject: [PATCH] [sanitizer] 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 -
|
||||
.../TestCases/Linux/crypt_r.cpp | 36 ------------------
|
||||
.../TestCases/Posix/crypt.cpp | 32 ----------------
|
||||
6 files changed, 116 deletions(-)
|
||||
delete mode 100644 compiler-rt/test/sanitizer_common/TestCases/Linux/crypt_r.cpp
|
||||
delete mode 100644 compiler-rt/test/sanitizer_common/TestCases/Posix/crypt.cpp
|
||||
|
||||
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
|
||||
index b30c91f06cfeb0..490a8b12d8b17d 100644
|
||||
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
|
||||
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
|
||||
@@ -10086,41 +10086,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;
|
||||
@@ -10698,8 +10663,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/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
|
||||
index eb39fabfd59839..c82ab5c2105621 100644
|
||||
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
|
||||
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
|
||||
@@ -569,8 +569,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/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
|
||||
index a04eed7aa5a6e..6d61d276d77e3 100644
|
||||
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
|
||||
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
|
||||
@@ -142,5 +142,4 @@
|
||||
#include <linux/serial.h>
|
||||
#include <sys/msg.h>
|
||||
#include <sys/ipc.h>
|
||||
-#include <crypt.h>
|
||||
#endif // SANITIZER_ANDROID
|
||||
@@ -243,7 +244,6 @@
|
||||
unsigned struct_ustat_sz = SIZEOF_STRUCT_USTAT;
|
||||
unsigned struct_rlimit64_sz = sizeof(struct rlimit64);
|
||||
unsigned struct_statvfs64_sz = sizeof(struct statvfs64);
|
||||
- unsigned struct_crypt_data_sz = sizeof(struct crypt_data);
|
||||
#endif // SANITIZER_LINUX && !SANITIZER_ANDROID
|
||||
|
||||
#if SANITIZER_LINUX && !SANITIZER_ANDROID
|
||||
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
|
||||
index e6f298c26e1fb6..58244c9944a03a 100644
|
||||
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
|
||||
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
|
||||
@@ -309,7 +309,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 {
|
||||
diff --git a/test/sanitizer_common/TestCases/Linux/crypt_r.cpp b/test/sanitizer_common/TestCases/Linux/crypt_r.cpp
|
||||
deleted file mode 100644
|
||||
index 69bfb46aa5f171..00000000000000
|
||||
--- a/compiler-rt/test/sanitizer_common/TestCases/Linux/crypt_r.cpp
|
||||
+++ /dev/null
|
||||
@@ -1,36 +0,0 @@
|
||||
-// RUN: %clangxx -O0 -g %s -lcrypt -o %t && %run %t
|
||||
-
|
||||
-// crypt.h is missing from Android.
|
||||
-// UNSUPPORTED: android
|
||||
-
|
||||
-#include <assert.h>
|
||||
-#include <unistd.h>
|
||||
-#include <cstring>
|
||||
-#include <crypt.h>
|
||||
-
|
||||
-int main(int argc, char **argv) {
|
||||
- {
|
||||
- crypt_data cd;
|
||||
- cd.initialized = 0;
|
||||
- char *p = crypt_r("abcdef", "xz", &cd);
|
||||
- volatile size_t z = strlen(p);
|
||||
- }
|
||||
- {
|
||||
- crypt_data cd;
|
||||
- cd.initialized = 0;
|
||||
- char *p = crypt_r("abcdef", "$1$", &cd);
|
||||
- volatile size_t z = strlen(p);
|
||||
- }
|
||||
- {
|
||||
- crypt_data cd;
|
||||
- cd.initialized = 0;
|
||||
- char *p = crypt_r("abcdef", "$5$", &cd);
|
||||
- volatile size_t z = strlen(p);
|
||||
- }
|
||||
- {
|
||||
- crypt_data cd;
|
||||
- cd.initialized = 0;
|
||||
- char *p = crypt_r("abcdef", "$6$", &cd);
|
||||
- volatile size_t z = strlen(p);
|
||||
- }
|
||||
-}
|
||||
diff --git a/test/sanitizer_common/TestCases/Posix/crypt.cpp b/test/sanitizer_common/TestCases/Posix/crypt.cpp
|
||||
deleted file mode 100644
|
||||
index 3a8faaa1ae7682..00000000000000
|
||||
--- a/compiler-rt/test/sanitizer_common/TestCases/Posix/crypt.cpp
|
||||
+++ /dev/null
|
||||
@@ -1,32 +0,0 @@
|
||||
-// RUN: %clangxx -O0 -g %s -o %t -lcrypt && %run %t
|
||||
-
|
||||
-// crypt() is missing from Android and -lcrypt from darwin.
|
||||
-// UNSUPPORTED: android, darwin
|
||||
-
|
||||
-#include <assert.h>
|
||||
-#include <unistd.h>
|
||||
-#include <cstring>
|
||||
-#if __has_include(<crypt.h>)
|
||||
-#include <crypt.h>
|
||||
-#endif
|
||||
-
|
||||
-int
|
||||
-main (int argc, char** argv)
|
||||
-{
|
||||
- {
|
||||
- char *p = crypt("abcdef", "xz");
|
||||
- volatile size_t z = strlen(p);
|
||||
- }
|
||||
- {
|
||||
- char *p = crypt("abcdef", "$1$");
|
||||
- volatile size_t z = strlen(p);
|
||||
- }
|
||||
- {
|
||||
- char *p = crypt("abcdef", "$5$");
|
||||
- volatile size_t z = strlen(p);
|
||||
- }
|
||||
- {
|
||||
- char *p = crypt("abcdef", "$6$");
|
||||
- volatile size_t z = strlen(p);
|
||||
- }
|
||||
-}
|
|
@ -0,0 +1,50 @@
|
|||
This commit is from upstream and is included in the llvm-15 release
|
||||
|
||||
commit b379129c4beb3f26223288627a1291739f33af02
|
||||
Author: Fangrui Song <i@maskray.me>
|
||||
Date: Mon Jul 11 11:38:28 2022 -0700
|
||||
|
||||
[sanitizer] Remove #include <linux/fs.h> to resolve fsconfig_command/mount_attr conflict with glibc 2.36
|
||||
|
||||
It is generally not a good idea to mix usage of glibc headers and Linux UAPI
|
||||
headers (https://sourceware.org/glibc/wiki/Synchronizing_Headers). In glibc
|
||||
since 7eae6a91e9b1670330c9f15730082c91c0b1d570 (milestone: 2.36), sys/mount.h
|
||||
defines `fsconfig_command` which conflicts with linux/mount.h:
|
||||
|
||||
.../usr/include/linux/mount.h:95:6: error: redeclaration of ‘enum fsconfig_command’
|
||||
|
||||
Remove #include <linux/fs.h> which pulls in linux/mount.h. Expand its 4 macros manually.
|
||||
|
||||
Fix https://github.com/llvm/llvm-project/issues/56421
|
||||
|
||||
Reviewed By: #sanitizers, vitalybuka, zatrazz
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D129471
|
||||
|
||||
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
|
||||
index 4bd425435d56..81740bf4ab39 100644
|
||||
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
|
||||
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
|
||||
@@ -73,7 +73,6 @@
|
||||
#include <sys/vt.h>
|
||||
#include <linux/cdrom.h>
|
||||
#include <linux/fd.h>
|
||||
-#include <linux/fs.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/ioctl.h>
|
||||
@@ -876,10 +875,10 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
|
||||
unsigned IOCTL_EVIOCGPROP = IOCTL_NOT_PRESENT;
|
||||
unsigned IOCTL_EVIOCSKEYCODE_V2 = IOCTL_NOT_PRESENT;
|
||||
#endif
|
||||
- unsigned IOCTL_FS_IOC_GETFLAGS = FS_IOC_GETFLAGS;
|
||||
- unsigned IOCTL_FS_IOC_GETVERSION = FS_IOC_GETVERSION;
|
||||
- unsigned IOCTL_FS_IOC_SETFLAGS = FS_IOC_SETFLAGS;
|
||||
- unsigned IOCTL_FS_IOC_SETVERSION = FS_IOC_SETVERSION;
|
||||
+ unsigned IOCTL_FS_IOC_GETFLAGS = _IOR('f', 1, long);
|
||||
+ unsigned IOCTL_FS_IOC_GETVERSION = _IOR('v', 1, long);
|
||||
+ unsigned IOCTL_FS_IOC_SETFLAGS = _IOW('f', 2, long);
|
||||
+ unsigned IOCTL_FS_IOC_SETVERSION = _IOW('v', 2, long);
|
||||
unsigned IOCTL_GIO_CMAP = GIO_CMAP;
|
||||
unsigned IOCTL_GIO_FONT = GIO_FONT;
|
||||
unsigned IOCTL_GIO_UNIMAP = GIO_UNIMAP;
|
Loading…
Reference in a new issue