Skip to content

Commit

Permalink
Fix sanitizer-common build with glibc 2.31
Browse files Browse the repository at this point in the history
Summary:
As mentioned in D69104, glibc changed ABI recently with the [[ https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=2f959dfe849e0646e27403f2e4091536496ac0f0| 2f959dfe ]] change.
D69104 dealt with just 32-bit ARM, but that is just one of the many affected architectures.
E.g. x86_64, i?86, riscv64, sparc 32-bit, s390 31-bit are affected too (and various others).

This patch instead of adding a long list of further architectures that wouldn't be checked ever next to arm 32-bit changes the structures to match the 2.31 layout and performs the checking on Linux for ipc_perm mode position/size only on non-Linux or on Linux with glibc 2.31 or later.  I think this matches what is done for aarch64 already.
If needed, we could list architectures that haven't changed ABI (e.g. powerpc), so that they would be checked even with older glibcs.  AFAIK sanitizers don't actually use ipc_perm.mode and
so all they care about is the size and alignment of the whole structure.

Note, s390 31-bit and arm 32-bit big-endian changed ABI even further, there will now be shmctl with old symbol version and shmctl@@GLIBC_2.31 which will be incompatible.  I'm afraid this isn't really solvable unless the sanitizer libraries are symbol versioned and use matching symbol versions to glibc symbols for stuff they intercept, plus use dlvsym.
This patch doesn't try to address that.

Patch by Jakub Jelinek.

Reviewers: kcc, eugenis, dvyukov

Reviewed By: eugenis

Subscribers: jyknight, kristof.beyls, fedor.sergeev, simoncook, PkmX, s.egerton, steven.zhang, #sanitizers, llvm-commits

Tags: #sanitizers, #llvm

Differential Revision: https://reviews.llvm.org/D70662
  • Loading branch information
eugenis committed Nov 25, 2019
1 parent d930ed1 commit 947f969
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1128,11 +1128,9 @@ CHECK_SIZE_AND_OFFSET(ipc_perm, uid);
CHECK_SIZE_AND_OFFSET(ipc_perm, gid);
CHECK_SIZE_AND_OFFSET(ipc_perm, cuid);
CHECK_SIZE_AND_OFFSET(ipc_perm, cgid);
#if (!defined(__aarch64__) || !SANITIZER_LINUX || __GLIBC_PREREQ (2, 21)) && \
!defined(__arm__)
/* On aarch64 glibc 2.20 and earlier provided incorrect mode field. */
/* On Arm newer glibc provide a different mode field, it's hard to detect
so just disable the check. */
#if !SANITIZER_LINUX || __GLIBC_PREREQ (2, 31)
/* glibc 2.30 and earlier provided 16-bit mode field instead of 32-bit
on many architectures. */
CHECK_SIZE_AND_OFFSET(ipc_perm, mode);
#endif

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,26 +207,13 @@ struct __sanitizer_ipc_perm {
u64 __unused1;
u64 __unused2;
#elif defined(__sparc__)
#if defined(__arch64__)
unsigned mode;
unsigned short __pad1;
#else
unsigned short __pad1;
unsigned short mode;
unsigned short __pad2;
#endif
unsigned short __seq;
unsigned long long __unused1;
unsigned long long __unused2;
#elif defined(__mips__) || defined(__aarch64__) || defined(__s390x__)
unsigned int mode;
unsigned short __seq;
unsigned short __pad1;
unsigned long __unused1;
unsigned long __unused2;
#else
unsigned short mode;
unsigned short __pad1;
unsigned int mode;
unsigned short __seq;
unsigned short __pad2;
#if defined(__x86_64__) && !defined(_LP64)
Expand Down

1 comment on commit 947f969

@786674917
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

where to find the compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp

Please sign in to comment.