diff mbox

[2/2] Fixed dirent sanitizer for 32-bit OS X builds

Message ID 1408989818-40728-2-git-send-email-jrtc27@jrtc27.com
State New
Headers show

Commit Message

Jessica Clarke Aug. 25, 2014, 6:03 p.m. UTC
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(-)

Comments

Jessica Clarke Aug. 25, 2014, 6:19 p.m. UTC | #1
Please note that this fixes PR 61407 (forgot to add it to libsanitizer/ChangeLog).

James Clarke

> On 25 Aug 2014, at 19:03, James Clarke <jrtc27@jrtc27.com> wrote:
> 
> 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
>
Mike Stump Aug. 25, 2014, 7:46 p.m. UTC | #2
On Aug 25, 2014, at 11:03 AM, James Clarke <jrtc27@jrtc27.com> wrote:
> 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:

I’m fine with this, I’d think that the sanitizer people want to review and push this into the tree.
diff mbox

Patch

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;