diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2016-06-07 13:19:38 +0000 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2016-06-07 13:19:38 +0000 |
commit | 82b06801e3f4711f37b4225f12accf8b7cc9b251 (patch) | |
tree | ef00754c7d854e1ceb0ce73c84d8751a6b52baca /lib/sanitizer_common/sanitizer_platform_limits_posix.h | |
parent | a5134578bd9c93be34fc610f9717c1aac7118fec (diff) |
[sanitizer] Fix build for new GLIBC msghdr/cmsghdr definition
GLIBC now follows POSIX [1] for both msghdr and cmsghdr definitions,
which means that msg_iovlen, msg_controllen, and cmsg_len are no
longer size_t but sockelen_t for 64-bits architectures. The final struct
size does not change, since paddings were added.
This patch fixes the build issue against GLIBC 2.24 socket.h header by
using the same definition for internal __sanitizer_msghdr and
__sanitizer_cmsghdr.
[1] http://pubs.opengroup.org/onlinepubs/9699919799/
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@272008 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_platform_limits_posix.h')
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_limits_posix.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/lib/sanitizer_common/sanitizer_platform_limits_posix.h index 14bc75046..ba49c5e21 100644 --- a/lib/sanitizer_common/sanitizer_platform_limits_posix.h +++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.h @@ -415,6 +415,49 @@ namespace __sanitizer { int cmsg_type; }; #else +# 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) && defined(_LP64) +# if __BYTE_ORDER == __BIG_ENDIAN + struct __sanitizer_msghdr { + void *msg_name; + unsigned msg_namelen; + struct __sanitizer_iovec *msg_iov; + int __padding1; + unsigned msg_iovlen; + void *msg_control; + int __padding2; + unsigned msg_controllen; + int msg_flags; + }; + struct __sanitizer_cmsghdr { + uptr cmsg_len; + int cmsg_level; + int cmsg_type; + }; +# else + struct __sanitizer_msghdr { + void *msg_name; + unsigned msg_namelen; + struct __sanitizer_iovec *msg_iov; + int msg_iovlen; + int __padding1; + void *msg_control; + int msg_controllen; + int __padding2; + int msg_flags; + }; + struct __sanitizer_cmsghdr { + unsigned cmsg_len; + int __padding1; + int cmsg_level; + int cmsg_type; + }; +# endif // __BYTE_ORDER == __BIG_ENDIAN +# else struct __sanitizer_msghdr { void *msg_name; unsigned msg_namelen; @@ -429,6 +472,7 @@ namespace __sanitizer { int cmsg_level; int cmsg_type; }; +# endif // __GLIBC_PREREQ (2, 24) && __WORDSIZE == 64 #endif #if SANITIZER_MAC |