From 1c1e7fb65828c99d6e0f0f3857089b559a0c8189 Mon Sep 17 00:00:00 2001 From: Carlos O'Donell Date: Thu, 2 Jun 2016 23:30:11 -0400 Subject: [PATCH] Fix macro API for __USE_KERNEL_IPV6_DEFS. The use of __USE_KERNEL_IPV6_DEFS with ifndef is bad practice per: https://sourceware.org/glibc/wiki/Wundef. This change moves it to use 'if' and always define the macro. Please note that this is not the only problem with this code. I have a series of fixes after this one to resolve breakage with this code and add regression tests for it via compile-only source testing (to be discussed in another thread). Unfortunately __USE_KERNEL_XATTR_DEFS is set by the kernel and not glibc, and uses 'define', so we can't fix that yet. --- ChangeLog | 9 +++++++++ inet/netinet/in.h | 14 +++++++------- sysdeps/unix/sysv/linux/bits/in.h | 4 +++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7dfe5752a7..4e7fd30b49 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2016-06-02 Carlos O'Donell + + * sysdeps/unix/sysv/linux/bits/in.h [defined _UAPI_LINUX_IN6_H || + defined _UAPI_IPV6_H]: Define __USE_KERNEL_IPV6_DEFS to 1. + [!(defined _UAPI_LINUX_IN6_H || defined _UAPI_IPV6_H)]: Define + __USE_KERNEL_IPV6_DEFS to 0. + * inet/netinet/in.h: Use '#if !__USE_KERNEL_IPV6_DEFS'. + Update comment. + 2016-06-01 Florian Weimer [BZ #19861] diff --git a/inet/netinet/in.h b/inet/netinet/in.h index 6122ab599b..c801593b32 100644 --- a/inet/netinet/in.h +++ b/inet/netinet/in.h @@ -92,10 +92,10 @@ enum IPPROTO_MAX }; -/* If __USE_KERNEL_IPV6_DEFS is defined then the user has included the kernel +/* If __USE_KERNEL_IPV6_DEFS is 1 then the user has included the kernel network headers first and we should use those ABI-identical definitions - instead of our own. */ -#ifndef __USE_KERNEL_IPV6_DEFS + instead of our own, otherwise 0. */ +#if !__USE_KERNEL_IPV6_DEFS enum { IPPROTO_HOPOPTS = 0, /* IPv6 Hop-by-Hop options. */ @@ -206,7 +206,7 @@ enum #define INADDR_ALLRTRS_GROUP ((in_addr_t) 0xe0000002) /* 224.0.0.2 */ #define INADDR_MAX_LOCAL_GROUP ((in_addr_t) 0xe00000ff) /* 224.0.0.255 */ -#ifndef __USE_KERNEL_IPV6_DEFS +#if !__USE_KERNEL_IPV6_DEFS /* IPv6 address */ struct in6_addr { @@ -249,7 +249,7 @@ struct sockaddr_in sizeof (struct in_addr)]; }; -#ifndef __USE_KERNEL_IPV6_DEFS +#if !__USE_KERNEL_IPV6_DEFS /* Ditto, for IPv6. */ struct sockaddr_in6 { @@ -285,7 +285,7 @@ struct ip_mreq_source }; #endif -#ifndef __USE_KERNEL_IPV6_DEFS +#if !__USE_KERNEL_IPV6_DEFS /* Likewise, for IPv6. */ struct ipv6_mreq { @@ -532,7 +532,7 @@ extern int bindresvport6 (int __sockfd, struct sockaddr_in6 *__sock_in) #ifdef __USE_GNU struct cmsghdr; /* Forward declaration. */ -#ifndef __USE_KERNEL_IPV6_DEFS +#if !__USE_KERNEL_IPV6_DEFS /* IPv6 packet information. */ struct in6_pktinfo { diff --git a/sysdeps/unix/sysv/linux/bits/in.h b/sysdeps/unix/sysv/linux/bits/in.h index d75c07b9fd..9bdadf3c8f 100644 --- a/sysdeps/unix/sysv/linux/bits/in.h +++ b/sysdeps/unix/sysv/linux/bits/in.h @@ -30,7 +30,9 @@ /* This is not quite the same API since the kernel always defines s6_addr16 and s6_addr32. This is not a violation of POSIX since POSIX says "at least the following member" and that holds true. */ -# define __USE_KERNEL_IPV6_DEFS +# define __USE_KERNEL_IPV6_DEFS 1 +#else +# define __USE_KERNEL_IPV6_DEFS 0 #endif /* Options for use with `getsockopt' and `setsockopt' at the IP level.