inet: Make IN6_IS_ADDR_UNSPECIFIED etc. usable with POSIX [BZ #16421]
authorFlorian Weimer <fweimer@redhat.com>
Fri, 9 Dec 2016 10:27:44 +0000 (11:27 +0100)
committerFlorian Weimer <fweimer@redhat.com>
Fri, 9 Dec 2016 10:27:44 +0000 (11:27 +0100)
Previously, under some feature test macros and compilers, the
macros were defined, but references undefined struct members
in their implementation.

ChangeLog
inet/Makefile
inet/netinet/in.h
inet/tst-checks-posix.c [new file with mode: 0644]
inet/tst-checks.c

index fa3c109..5a9191a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2016-12-09  Carlos O'Donell  <carlos@redhat.com>
+           Florian Weimer  <fweimer@redhat.com>
+
+       [BZ #16421]
+       * inet/netinet/in.h (struct in6_addr): Always define __u6_addr16
+       and __u6_addr32 members.
+       (IN6_IS_ADDR_UNSPECIFIED, IN6_IS_ADDR_LOOPBACK)
+       (IN6_IS_ADDR_LINKLOCAL, IN6_IS_ADDR_SITELOCAL)
+       (IN6_IS_ADDR_V4MAPPED, IN6_IS_ADDR_V4COMPAT, IN6_ARE_ADDR_EQUAL):
+       Use __u6_addr32.
+       * inet/tst-checks.c: Use <support/test-driver.c>
+       * inet/tst-checks-posix.c: New file.
+       * inet/Makefile (tests): Add it.
+       (CFLAGS-tst-checks-posix.c): Compile in C99 mode.
+
 2016-12-09  Florian Weimer  <fweimer@redhat.com>
 
        New subdirectory support for build and test infrastructure.
index 1c30932..c82ad92 100644 (file)
@@ -51,8 +51,8 @@ aux := check_pf check_native ifreq
 
 tests := htontest test_ifindex tst-ntoa tst-ether_aton tst-network \
         tst-gethnm test-ifaddrs bug-if1 test-inet6_opt tst-ether_line \
-        tst-getni1 tst-getni2 tst-inet6_rth tst-checks tst-sockaddr \
-        tst-inet6_scopeid_pton
+        tst-getni1 tst-getni2 tst-inet6_rth tst-checks tst-checks-posix \
+        tst-sockaddr tst-inet6_scopeid_pton
 
 include ../Rules
 
@@ -86,6 +86,7 @@ CFLAGS-either_hton.c = -fexceptions
 CFLAGS-getnetgrent.c = -fexceptions
 CFLAGS-getnetgrent_r.c = -fexceptions
 
+CFLAGS-tst-checks-posix.c = -std=c99
 CFLAGS-tst-sockaddr.c = -fno-strict-aliasing
 
 endif
index c801593..01594c6 100644 (file)
@@ -213,10 +213,8 @@ struct in6_addr
     union
       {
        uint8_t __u6_addr8[16];
-#ifdef __USE_MISC
        uint16_t __u6_addr16[8];
        uint32_t __u6_addr32[4];
-#endif
       } __in6_u;
 #define s6_addr                        __in6_u.__u6_addr8
 #ifdef __USE_MISC
@@ -411,52 +409,52 @@ extern uint16_t htons (uint16_t __hostshort)
 # define IN6_IS_ADDR_UNSPECIFIED(a) \
   (__extension__                                                             \
    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);            \
-      __a->s6_addr32[0] == 0                                                 \
-      && __a->s6_addr32[1] == 0                                                      \
-      && __a->s6_addr32[2] == 0                                                      \
-      && __a->s6_addr32[3] == 0; }))
+      __a->__in6_u.__u6_addr32[0] == 0                                       \
+      && __a->__in6_u.__u6_addr32[1] == 0                                    \
+      && __a->__in6_u.__u6_addr32[2] == 0                                    \
+      && __a->__in6_u.__u6_addr32[3] == 0; }))
 
 # define IN6_IS_ADDR_LOOPBACK(a) \
   (__extension__                                                             \
    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);            \
-      __a->s6_addr32[0] == 0                                                 \
-      && __a->s6_addr32[1] == 0                                                      \
-      && __a->s6_addr32[2] == 0                                                      \
-      && __a->s6_addr32[3] == htonl (1); }))
+      __a->__in6_u.__u6_addr32[0] == 0                                       \
+      && __a->__in6_u.__u6_addr32[1] == 0                                    \
+      && __a->__in6_u.__u6_addr32[2] == 0                                    \
+      && __a->__in6_u.__u6_addr32[3] == htonl (1); }))
 
 # define IN6_IS_ADDR_LINKLOCAL(a) \
   (__extension__                                                             \
    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);            \
-      (__a->s6_addr32[0] & htonl (0xffc00000)) == htonl (0xfe800000); }))
+      (__a->__in6_u.__u6_addr32[0] & htonl (0xffc00000)) == htonl (0xfe800000); }))
 
 # define IN6_IS_ADDR_SITELOCAL(a) \
   (__extension__                                                             \
    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);            \
-      (__a->s6_addr32[0] & htonl (0xffc00000)) == htonl (0xfec00000); }))
+      (__a->__in6_u.__u6_addr32[0] & htonl (0xffc00000)) == htonl (0xfec00000); }))
 
 # define IN6_IS_ADDR_V4MAPPED(a) \
   (__extension__                                                             \
    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);            \
-      __a->s6_addr32[0] == 0                                                 \
-      && __a->s6_addr32[1] == 0                                                      \
-      && __a->s6_addr32[2] == htonl (0xffff); }))
+      __a->__in6_u.__u6_addr32[0] == 0                                       \
+      && __a->__in6_u.__u6_addr32[1] == 0                                    \
+      && __a->__in6_u.__u6_addr32[2] == htonl (0xffff); }))
 
 # define IN6_IS_ADDR_V4COMPAT(a) \
   (__extension__                                                             \
    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);            \
-      __a->s6_addr32[0] == 0                                                 \
-      && __a->s6_addr32[1] == 0                                                      \
-      && __a->s6_addr32[2] == 0                                                      \
-      && ntohl (__a->s6_addr32[3]) > 1; }))
+      __a->__in6_u.__u6_addr32[0] == 0                                       \
+      && __a->__in6_u.__u6_addr32[1] == 0                                    \
+      && __a->__in6_u.__u6_addr32[2] == 0                                    \
+      && ntohl (__a->__in6_u.__u6_addr32[3]) > 1; }))
 
 # define IN6_ARE_ADDR_EQUAL(a,b) \
   (__extension__                                                             \
    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);            \
       const struct in6_addr *__b = (const struct in6_addr *) (b);            \
-      __a->s6_addr32[0] == __b->s6_addr32[0]                                 \
-      && __a->s6_addr32[1] == __b->s6_addr32[1]                                      \
-      && __a->s6_addr32[2] == __b->s6_addr32[2]                                      \
-      && __a->s6_addr32[3] == __b->s6_addr32[3]; }))
+      __a->__in6_u.__u6_addr32[0] == __b->__in6_u.__u6_addr32[0]             \
+      && __a->__in6_u.__u6_addr32[1] == __b->__in6_u.__u6_addr32[1]          \
+      && __a->__in6_u.__u6_addr32[2] == __b->__in6_u.__u6_addr32[2]          \
+      && __a->__in6_u.__u6_addr32[3] == __b->__in6_u.__u6_addr32[3]; }))
 #else
 # define IN6_IS_ADDR_UNSPECIFIED(a) \
        (((const uint32_t *) (a))[0] == 0                                     \
diff --git a/inet/tst-checks-posix.c b/inet/tst-checks-posix.c
new file mode 100644 (file)
index 0000000..c41a180
--- /dev/null
@@ -0,0 +1,24 @@
+/* Test IPv6 classification macros in POSIX mode.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* Process tst-checks.c in POSIX mode.  */
+#undef _GNU_SOURCE
+#define _POSIX_C_SOURCE 200112L
+#define _ISOMAC
+
+#include "tst-checks.c"
index 5d97564..1a4785d 100644 (file)
@@ -169,5 +169,4 @@ do_test (void)
   return result;
 }
 
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
+#include <support/test-driver.c>