Bug 20214: Fix linux/in6.h and netinet/in.h sync.
authorCarlos O'Donell <carlos@redhat.com>
Tue, 7 Jun 2016 08:46:37 +0000 (04:46 -0400)
committerCarlos O'Donell <carlos@redhat.com>
Tue, 7 Jun 2016 08:46:37 +0000 (04:46 -0400)
In: https://sourceware.org/glibc/wiki/Synchronizing_Headers
we explain how we synchronize our headers with Linux kernel
headers.

In order to synchronize with the Linux linux/in6.h and
linux/ipv6.h headers we checked for their guard macros and
then defined __USE_KERNEL_IPV6_DEFS and conditionalized code
on this macro.

In upstream kernel 56c176c9 the _UAPI prefix was stripped and
this broke our synchronized headers again. We now need to check
for _LINUX_IN6_H and _IPV6_H, and keep checking the old versions
of the header guard checks for maximum backwards compatibility
with older Linux headers (the history is actually a bit muddled
here and it appears upstream linus kernel broke this 10 months
*before* our fix was ever applied to glibc, but without glibc
testing we didn't notice and distro kernels have their own
testing to fix this).

This patch fixes synchronization with linux/in6.h and
with netinet/in.h.

ChangeLog
sysdeps/unix/sysv/linux/bits/in.h

index 8697644..f006508 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,17 @@
-2016-06-03  Carlos O'Donell  <carlos@redhat.com>
+2016-06-07  Carlos O'Donell  <carlos@redhat.com>
+
+       [BZ #20214]
+       * sysdeps/unix/sysv/linux/bits/in.h
+       [defined _UAPI_LINUX_IN6_H || defined _UAPI_IPV6_H
+        || defined _LINUX_IN6_H || defined _IPV6_H] (__USE_KERNEL_IPV6_DEFS):
+       Define to 1.
+       [!(defined _UAPI_LINUX_IN6_H || defined _UAPI_IPV6_H
+        || defined _LINUX_IN6_H || defined _IPV6_H)] (__USE_KERNEL_IPV6_DEFS):
+       Define to 0.
+       [!__USE_KERNEL_IPV6_DEFS] (IPV6_ADD_MEMBERSHIP): Define.
+       [!__USE_KERNEL_IPV6_DEFS] (IPV6_DROP_MEMBERSHIP): Define.
+
+2016-06-06  Carlos O'Donell  <carlos@redhat.com>
 
        [BZ #20198]
        * stdlib/Makefile (tests): Add tst-quick_exit, and
index 9bdadf3..4d70a6b 100644 (file)
    kernel then we will not define the IPv6 IPPROTO_* defines, in6_addr (nor the
    defines), sockaddr_in6, or ipv6_mreq. Same for in6_ptkinfo or ip6_mtuinfo
    in linux/ipv6.h. The ABI used by the linux-kernel and glibc match exactly.
-   Neither the linux kernel nor glibc should break this ABI without coordination.  */
-#if defined _UAPI_LINUX_IN6_H || defined _UAPI_IPV6_H
+   Neither the linux kernel nor glibc should break this ABI without coordination.
+   In upstream kernel 56c176c9 the _UAPI prefix was stripped so we need to check
+   for _LINUX_IN6_H and _IPV6_H now, and keep checking the old versions for
+   maximum backwards compatibility.  */
+#if defined _UAPI_LINUX_IN6_H \
+    || defined _UAPI_IPV6_H \
+    || defined _LINUX_IN6_H \
+    || defined _IPV6_H
 /* 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.  */
@@ -209,8 +215,10 @@ struct in_pktinfo
 #define IPV6_TCLASS            67
 
 /* Obsolete synonyms for the above.  */
-#define IPV6_ADD_MEMBERSHIP    IPV6_JOIN_GROUP
-#define IPV6_DROP_MEMBERSHIP   IPV6_LEAVE_GROUP
+#if !__USE_KERNEL_IPV6_DEFS
+# define IPV6_ADD_MEMBERSHIP   IPV6_JOIN_GROUP
+# define IPV6_DROP_MEMBERSHIP  IPV6_LEAVE_GROUP
+#endif
 #define IPV6_RXHOPOPTS         IPV6_HOPOPTS
 #define IPV6_RXDSTOPTS         IPV6_DSTOPTS