This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH v2 2/2] Fixed dirent sanitizer for 32-bit OS X builds
- From: James Clarke <jrtc27 at jrtc27 dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: James Clarke <jrtc27 at jrtc27 dot com>
- Date: Tue, 26 Aug 2014 17:02:19 +0100
- Subject: [PATCH v2 2/2] Fixed dirent sanitizer for 32-bit OS X builds
- Authentication-results: sourceware.org; auth=none
- References: <1409068939-58268-1-git-send-email-jrtc27 at jrtc27 dot com>
The __DARWIN_64_BIT_INO_T macro is used to indicate whether dirent.d_ino
is 64-bit or not, and so should be sized appropriately. Additionally,
dirent.d_seekoff should only be defined/checked when
__DARWIN_64_BIT_INO_T is defined.
libsanitizer/ChangeLog:
* sanitizer_common/sanitizer_platform_limits_posix.cc: Only check
dirent.d_seekoff on OS X when performing a 64-bit build.
* sanitizer_common/sanitizer_platform_limits_posix.h: Only define
dirent.d_seekoff on OS X when performing a 64-bit build, and make
dirent.d_ino the correct size (32-bit) when performing a 32-bit
build.
---
libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc | 3 ++-
libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h | 9 +++++++++
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc
index a93d38d..0d1870b 100644
--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc
+++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc
@@ -940,7 +940,8 @@ CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_type);
COMPILER_CHECK(sizeof(__sanitizer_dirent) <= sizeof(dirent));
CHECK_SIZE_AND_OFFSET(dirent, d_ino);
-#if SANITIZER_MAC
+#if SANITIZER_MAC && __DARWIN_64_BIT_INO_T
+// The 'd_seekoff' field is only present on OS X for 64-bit builds
CHECK_SIZE_AND_OFFSET(dirent, d_seekoff);
#elif SANITIZER_FREEBSD
// There is no 'd_off' field on FreeBSD.
diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
index dece2d3..73a4c3f 100644
--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -392,12 +392,21 @@ namespace __sanitizer {
#endif
#if SANITIZER_MAC
+# if __DARWIN_64_BIT_INO_T
struct __sanitizer_dirent {
unsigned long long d_ino;
unsigned long long d_seekoff;
unsigned short d_reclen;
// more fields that we don't care about
};
+# else
+ struct __sanitizer_dirent {
+ unsigned int d_ino;
+ // No d_seekoff for 32-bit
+ unsigned short d_reclen;
+ // more fields that we don't care about
+ };
+# endif
#elif SANITIZER_FREEBSD
struct __sanitizer_dirent {
unsigned int d_fileno;
--
2.1.0