Message ID | 1408989818-40728-2-git-send-email-jrtc27@jrtc27.com |
---|---|
State | New |
Headers | show |
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 >
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 --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;