Index: lib/sanitizer_common/sanitizer_platform_limits_posix.h =================================================================== --- lib/sanitizer_common/sanitizer_platform_limits_posix.h +++ lib/sanitizer_common/sanitizer_platform_limits_posix.h @@ -419,13 +419,48 @@ void *msg_name; unsigned msg_namelen; struct __sanitizer_iovec *msg_iov; +#ifndef __GLIBC_PREREQ +#define __GLIBC_PREREQ(x, y) 0 +#endif +// GLIBC 2.24 follows msghdr and cmsghdr POSIX definition for internal +// member size and adds padding where required. +#if __GLIBC_PREREQ (2, 24) && __WORDSIZE == 64 +# if __BYTE_ORDER == __BIG_ENDIAN + int __padding1; + unsigned msg_iovlen; +# else + unsigned msg_iovlen; + int __padding1; +# endif +# else uptr msg_iovlen; +# endif void *msg_control; +#if __GLIBC_PREREQ (2, 24) && __WORDSIZE == 64 +# if __BYTE_ORDER == __BIG_ENDIAN + int __padding2; + unsigned msg_controllen; +# else + unsigned msg_controllen; + int __padding2; +# endif +#else uptr msg_controllen; +#endif int msg_flags; }; struct __sanitizer_cmsghdr { +#if __GLIBC_PREREQ (2, 24) && __WORDSIZE == 64 +# if __BYTE_ORDER == __BIG_ENDIAN + int __padding1; + unsigned cmsg_len; +# else + unsigned cmsg_len; + int __padding1; +# endif +#else uptr cmsg_len; +#endif int cmsg_level; int cmsg_type; }; Index: lib/sanitizer_common/sanitizer_platform_limits_posix.cc =================================================================== --- lib/sanitizer_common/sanitizer_platform_limits_posix.cc +++ lib/sanitizer_common/sanitizer_platform_limits_posix.cc @@ -1011,17 +1011,32 @@ CHECK_SIZE_AND_OFFSET(iovec, iov_base); CHECK_SIZE_AND_OFFSET(iovec, iov_len); +#define CHECK_SENDMSG_MEMBER 1 +#if SANITIZER_LINUX +# if __GLIBC_PREREQ == 0 +# undef CHECK_SENDMSG_MEMBER +# endif +#endif + CHECK_TYPE_SIZE(msghdr); CHECK_SIZE_AND_OFFSET(msghdr, msg_name); +#if CHECK_SENDMSG_MEMBER CHECK_SIZE_AND_OFFSET(msghdr, msg_namelen); +#endif CHECK_SIZE_AND_OFFSET(msghdr, msg_iov); +#if CHECK_SENDMSG_MEMBER CHECK_SIZE_AND_OFFSET(msghdr, msg_iovlen); +#endif CHECK_SIZE_AND_OFFSET(msghdr, msg_control); +#if CHECK_SENDMSG_MEMBER CHECK_SIZE_AND_OFFSET(msghdr, msg_controllen); +#endif CHECK_SIZE_AND_OFFSET(msghdr, msg_flags); CHECK_TYPE_SIZE(cmsghdr); +#if CHECK_SENDMSG_MEMBER CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_len); +#endif CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_level); CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_type); @@ -1060,9 +1075,6 @@ // Can't write checks for sa_handler and sa_sigaction due to them being // preprocessor macros. CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_mask); -#ifndef __GLIBC_PREREQ -#define __GLIBC_PREREQ(x, y) 0 -#endif #if !defined(__s390x__) || __GLIBC_PREREQ (2, 20) // On s390x glibc 2.19 and earlier sa_flags was unsigned long, and sa_resv // didn't exist.