From 0abbe7cd700951082b314182a0958d65238297ef Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Fri, 9 Dec 2016 11:27:44 +0100 Subject: [PATCH] inet: Make IN6_IS_ADDR_UNSPECIFIED etc. usable with POSIX [BZ #16421] Previously, under some feature test macros and compilers, the macros were defined, but references undefined struct members in their implementation. --- ChangeLog | 15 ++++++++++++++ inet/Makefile | 5 +++-- inet/netinet/in.h | 44 ++++++++++++++++++++--------------------- inet/tst-checks-posix.c | 24 ++++++++++++++++++++++ inet/tst-checks.c | 3 +-- 5 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 inet/tst-checks-posix.c diff --git a/ChangeLog b/ChangeLog index fa3c109180..5a9191afaf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2016-12-09 Carlos O'Donell + Florian Weimer + + [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 + * 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 New subdirectory support for build and test infrastructure. diff --git a/inet/Makefile b/inet/Makefile index 1c30932997..c82ad924aa 100644 --- a/inet/Makefile +++ b/inet/Makefile @@ -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 diff --git a/inet/netinet/in.h b/inet/netinet/in.h index c801593b32..01594c6aec 100644 --- a/inet/netinet/in.h +++ b/inet/netinet/in.h @@ -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 index 0000000000..c41a180bf5 --- /dev/null +++ b/inet/tst-checks-posix.c @@ -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 + . */ + +/* Process tst-checks.c in POSIX mode. */ +#undef _GNU_SOURCE +#define _POSIX_C_SOURCE 200112L +#define _ISOMAC + +#include "tst-checks.c" diff --git a/inet/tst-checks.c b/inet/tst-checks.c index 5d97564cd6..1a4785d96e 100644 --- a/inet/tst-checks.c +++ b/inet/tst-checks.c @@ -169,5 +169,4 @@ do_test (void) return result; } -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include