As mentioned in <http://gcc.gnu.org/ml/gcc/2018-03/msg00133.html> the bogus adjustmen...
authorHans-Peter Nilsson <hp@axis.com>
Thu, 26 Apr 2018 01:12:56 +0000 (01:12 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Thu, 26 Apr 2018 01:12:56 +0000 (01:12 +0000)
As mentioned in <http://gcc.gnu.org/ml/gcc/2018-03/msg00133.html>
the bogus adjustment to 160 from 144 (which is reverted here),
is a single-token commit in upstream r301307, an attempt to
correct a failed build due to an upstream change to compile the
runtime with D_FILE_OFFSET_BITS=64.  The correct fix is here:
just use the right include.  Yes, user-struct-stat64-as-stat is
actually 160 for MIPS o32 and I hear user-struct-stat is also
160 for n32.  There are additional fields appended for
user-struct-stat!  I guess for MIPS it's as bad as it gets for
mixing up kernel and user struct stat.  The context of the patch
doesn't show that in the #else there's the correct include, the
one for <asm/stat.h> to get the kernel-struct-stat.  If you
can't compile it, IMHO the kernel headers are just too old; 3.2
is fine for example.

* sanitizer_common/sanitizer_platform_limits_linux.cc: Do not
take the shortcut to #include <sys/stat.h> for MIPS instead of
the kernel <asm/stat.h>.  Explain why sys/stat.h is misleading
or wrong to get the kernel struct stat.
* sanitizer_common/sanitizer_platform_limits_posix.h [__mips__]:
Correct the value for 32-bit non-android struct_kernel_stat_sz.

From-SVN: r259664

libsanitizer/ChangeLog
libsanitizer/sanitizer_common/sanitizer_platform_limits_linux.cc
libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h

index acde79f62db120b3eed9ecb4a58730b32355973c..141291f9e837b369b980ed0047dc2530752ea17f 100644 (file)
@@ -1,5 +1,12 @@
 2018-04-26  Hans-Peter Nilsson  <hp@axis.com>
 
+       * sanitizer_common/sanitizer_platform_limits_linux.cc: Do not
+       take the shortcut to #include <sys/stat.h> for MIPS instead of
+       the kernel <asm/stat.h>.  Explain why sys/stat.h is misleading
+       or wrong to get the kernel struct stat.
+       * sanitizer_common/sanitizer_platform_limits_posix.h [__mips__]:
+       Correct the value for 32-bit non-android struct_kernel_stat_sz.
+
        * sanitizer_common/sanitizer_atomic_clang_other.h [_MIPS_SIM
        && _MIPS_SIM == _ABIO32] (lock): Add initializer for .pad member.
 
index 23a014823c4fcca46e86dccc5bb57a2679df43f4..3a9065381293d589a6f6ceb543903fd2f4e75074 100644 (file)
 
 // With old kernels (and even new kernels on powerpc) asm/stat.h uses types that
 // are not defined anywhere in userspace headers. Fake them. This seems to work
-// fine with newer headers, too.
+// fine with newer headers, too.  Beware that with <sys/stat.h>, struct stat
+// takes the form of struct stat64 on 32-bit platforms if _FILE_OFFSET_BITS=64.
+// Also, for some platforms (e.g. mips) there are additional members in the
+// <sys/stat.h> struct stat:s.
 #include <linux/posix_types.h>
-#if defined(__x86_64__) ||  defined(__mips__)
+#if defined(__x86_64__)
 #include <sys/stat.h>
 #else
 #define ino_t __kernel_ino_t
index 4d11d071776c00e7e18d3356f8905d749509abe0..132e5e9beea19ea2e194681908e3378af1083338 100644 (file)
@@ -86,7 +86,7 @@ namespace __sanitizer {
 #elif defined(__mips__)
   const unsigned struct_kernel_stat_sz =
                  SANITIZER_ANDROID ? FIRST_32_SECOND_64(104, 128) :
-                                     FIRST_32_SECOND_64(160, 216);
+                                     FIRST_32_SECOND_64(144, 216);
   const unsigned struct_kernel_stat64_sz = 104;
 #elif defined(__s390__) && !defined(__s390x__)
   const unsigned struct_kernel_stat_sz = 64;