[PATCH] D69104: [Arm][libsanitizer] Fix arm libsanitizer failure with bleeding edge glibc

Jakub JelĂ­nek via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 20 02:18:04 PST 2019


jakubjelinek added a comment.

The change looks wrong, the upcoming glibc 2.31 changes aren't just about ARM, but actually most of the architectures, so adding a special case just for ARM is just weird.
Either we should change the structures to match what glibc 2.31 will have and disable this ipc_perm mode checking if not __GLIBC_PREREQ (2, 31) on SANITIZER_LINUX,
or the check needs to be disabled on most Linux architectures.
Affected are e.g. x86_64, i?86, riscv*, sparc 32-bit, s390 31-bit, arm.  And, on arm big endian and s390 31-bit there is even an important ABI change, so shmctl interception
won't be able to use dlsym but will need to use dlvsym.
Completely untested patch would be something like:

- sanitizer_common/sanitizer_platform_limits_posix.h     2019-11-07 17:56:23.530835549 +0100

+++ sanitizer_common/sanitizer_platform_limits_posix.h     2019-11-12 12:22:26.314511706 +0100                                        
@@ -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)                                                                                                        
---sanitizer_common/sanitizer_platform_limits_posix.cpp   2019-11-07 17:56:23.551835239 +0100                                        
+++ sanitizer_common/sanitizer_platform_limits_posix.cpp   2019-11-12 12:23:42.959358844 +0100                                        
@@ -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 most architectures.  */                                                                                                                     
 CHECK_SIZE_AND_OFFSET(ipc_perm, mode);                                                                                                            
 #endif

                                                                     


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D69104/new/

https://reviews.llvm.org/D69104





More information about the llvm-commits mailing list