Fix network headers stdint.h namespace (bug 21455).
authorJoseph Myers <joseph@codesourcery.com>
Thu, 4 May 2017 20:36:42 +0000 (20:36 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 4 May 2017 20:36:42 +0000 (20:36 +0000)
conform/ namespace tests of arpa/inet.h, netdb.h and netinet/in.h fail
for UNIX98 and XPG42 because of inclusion of stdint.h, which defines
macros not permitted in those headers for those standards.  UNIX98
allows them to include inttypes.h, but (predating C99) has restricted
inttypes.h contents (not yet tested in the conform/ tests) not
including those macros; XPG4.2 has no such permission and no
inttypes.h / stdint.h at all.

This patch rearranges the headers to avoid this issue.  intN_t
definitions move to bits/stdint-intn.h, and uintN_t definitions to
bits/stdint-uintn.h.  (These are not bits/types/ headers because they
each define four types.  They are separate rather than just a single
header because sys/types.h defines intN_t but u_intN_t rather than
uintN_t - and while sys/types.h could define uintN_t because of the
POSIX reservation of *_t, existing practice there is largely to
condition types on appropriate feature test macros, and indeed there
is at least one open bug report (14553) about a type that's not
so-conditioned, so maybe types there should actually have conditions
added where appropriate.)  The affected network headers are then made
to include bits/stdint-uintn.h instead of stdint.h.  This allows six
XFAILs to be removed.

This doesn't do anything about inttypes.h defining more than it should
for UNIX98, but we don't have conformtest expectations for that case
at present (and my inclination is that a fix for that should be as
local as possible - affecting only inttypes.h, not stdint.h, only for
the case of __USE_UNIX98 && !__USE_ISOC99).

Tested for x86_64.

[BZ #21455]
* bits/stdint-intn.h: New file.
* bits/stdint-uintn.h: Likewise.
* stdlib/Makefile (headers): Add bits/stdint-intn.h and
bits/stdint-uintn.h.
* inet/netinet/in.h: Include <bits/stdint-uintn.h> instead of
<stdint.h>.
* posix/sys/types.h: Include <bits/stdint-intn.h>.
(__int8_t_defined): Do not define here.
(int8_t): Likewise.
(int16_t): Likewise.
(int32_t): Likewise.
(int64_t): Likewise.
[__GNUC_PREREQ (2, 7)] (__intN_t): Likewise.
* resolv/netdb.h: Include <bits/stdint-uintn.h> instead of
<stdint.h>.
* include/netdb.h [_ISOMAC]: Do not include <stdint.h>.
* sysdeps/generic/stdint.h: Include <bits/stdint-intn.h> and
<bits/stdint-uintn.h>.
(int8_t): Do not define here.
(int16_t): Likewise.
(int32_t): Likewise.
(int64_t): Likewise.
(uint8_t): Likewise.
(uint16_t): Likewise.
(uint32_t): Likewise.
(uint64_t): Likewise.
* conform/Makefile (test-xfail-XPG42/arpa/inet.h/conform): Remove
variable.
(test-xfail-XPG42/netdb.h/conform): Likewise.
(test-xfail-XPG42/netinet/in.h/conform): Likewise.
(test-xfail-UNIX98/arpa/inet.h/conform): Likewise.
(test-xfail-UNIX98/netdb.h/conform): Likewise.
(test-xfail-UNIX98/netinet/in.h/conform): Likewise.

ChangeLog
bits/stdint-intn.h [new file with mode: 0644]
bits/stdint-uintn.h [new file with mode: 0644]
conform/Makefile
include/netdb.h
inet/netinet/in.h
posix/sys/types.h
resolv/netdb.h
stdlib/Makefile
sysdeps/generic/stdint.h

index c0bb010..a37bdd5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,40 @@
+2017-05-04  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #21455]
+       * bits/stdint-intn.h: New file.
+       * bits/stdint-uintn.h: Likewise.
+       * stdlib/Makefile (headers): Add bits/stdint-intn.h and
+       bits/stdint-uintn.h.
+       * inet/netinet/in.h: Include <bits/stdint-uintn.h> instead of
+       <stdint.h>.
+       * posix/sys/types.h: Include <bits/stdint-intn.h>.
+       (__int8_t_defined): Do not define here.
+       (int8_t): Likewise.
+       (int16_t): Likewise.
+       (int32_t): Likewise.
+       (int64_t): Likewise.
+       [__GNUC_PREREQ (2, 7)] (__intN_t): Likewise.
+       * resolv/netdb.h: Include <bits/stdint-uintn.h> instead of
+       <stdint.h>.
+       * include/netdb.h [_ISOMAC]: Do not include <stdint.h>.
+       * sysdeps/generic/stdint.h: Include <bits/stdint-intn.h> and
+       <bits/stdint-uintn.h>.
+       (int8_t): Do not define here.
+       (int16_t): Likewise.
+       (int32_t): Likewise.
+       (int64_t): Likewise.
+       (uint8_t): Likewise.
+       (uint16_t): Likewise.
+       (uint32_t): Likewise.
+       (uint64_t): Likewise.
+       * conform/Makefile (test-xfail-XPG42/arpa/inet.h/conform): Remove
+       variable.
+       (test-xfail-XPG42/netdb.h/conform): Likewise.
+       (test-xfail-XPG42/netinet/in.h/conform): Likewise.
+       (test-xfail-UNIX98/arpa/inet.h/conform): Likewise.
+       (test-xfail-UNIX98/netdb.h/conform): Likewise.
+       (test-xfail-UNIX98/netinet/in.h/conform): Likewise.
+
 2017-05-04  Paul E. Murphy  <murphyp@linux.vnet.ibm.com>
 
        * sysdeps/generic/math_private.h (mathx_hidden_def): New macro.
diff --git a/bits/stdint-intn.h b/bits/stdint-intn.h
new file mode 100644 (file)
index 0000000..8737486
--- /dev/null
@@ -0,0 +1,29 @@
+/* Define intN_t types.
+   Copyright (C) 2017 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/>.  */
+
+#ifndef _BITS_STDINT_INTN_H
+#define _BITS_STDINT_INTN_H    1
+
+#include <bits/types.h>
+
+typedef __int8_t int8_t;
+typedef __int16_t int16_t;
+typedef __int32_t int32_t;
+typedef __int64_t int64_t;
+
+#endif /* bits/stdint-intn.h */
diff --git a/bits/stdint-uintn.h b/bits/stdint-uintn.h
new file mode 100644 (file)
index 0000000..d27b778
--- /dev/null
@@ -0,0 +1,29 @@
+/* Define uintN_t types.
+   Copyright (C) 2017 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/>.  */
+
+#ifndef _BITS_STDINT_UINTN_H
+#define _BITS_STDINT_UINTN_H   1
+
+#include <bits/types.h>
+
+typedef __uint8_t uint8_t;
+typedef __uint16_t uint16_t;
+typedef __uint32_t uint32_t;
+typedef __uint64_t uint64_t;
+
+#endif /* bits/stdint-uintn.h */
index 2039ae8..63556b5 100644 (file)
@@ -163,16 +163,10 @@ test-xfail-XOPEN2K8/ndbm.h/conform = yes
 # Unsorted expected failures.
 test-xfail-XPG4/signal.h/conform = yes
 test-xfail-XPG4/sys/wait.h/conform = yes
-test-xfail-XPG42/arpa/inet.h/conform = yes
-test-xfail-XPG42/netdb.h/conform = yes
-test-xfail-XPG42/netinet/in.h/conform = yes
 test-xfail-XPG42/signal.h/conform = yes
 test-xfail-XPG42/sys/wait.h/conform = yes
 test-xfail-XPG42/ucontext.h/conform = yes
 test-xfail-POSIX/sys/wait.h/conform = yes
-test-xfail-UNIX98/arpa/inet.h/conform = yes
-test-xfail-UNIX98/netdb.h/conform = yes
-test-xfail-UNIX98/netinet/in.h/conform = yes
 test-xfail-UNIX98/signal.h/conform = yes
 test-xfail-UNIX98/sys/wait.h/conform = yes
 test-xfail-UNIX98/ucontext.h/conform = yes
index e1f051d..d425a64 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef        _NETDB_H
 #include <resolv/netdb.h>
-#include <stdint.h>
 
 #ifndef _ISOMAC
+# include <stdint.h>
 /* Macros for accessing h_errno from inside libc.  */
 # if IS_IN_LIB
 #  undef  h_errno
index e064188..f94b4b4 100644 (file)
@@ -19,7 +19,7 @@
 #define        _NETINET_IN_H   1
 
 #include <features.h>
-#include <stdint.h>
+#include <bits/stdint-uintn.h>
 #include <sys/socket.h>
 #include <bits/types.h>
 
index b3a27c5..c6326b1 100644 (file)
@@ -153,22 +153,11 @@ typedef unsigned int uint;
 
 /* These size-specific names are used by some of the inet code.  */
 
-#if !__GNUC_PREREQ (2, 7)
+#include <bits/stdint-intn.h>
 
-/* These types are defined by the ISO C99 header <inttypes.h>. */
-# ifndef __int8_t_defined
-#  define __int8_t_defined
-typedef        char int8_t;
-typedef        short int int16_t;
-typedef        int int32_t;
-#  if __WORDSIZE == 64
-typedef long int int64_t;
-#  else
-__extension__ typedef long long int int64_t;
-#  endif
-# endif
+#if !__GNUC_PREREQ (2, 7)
 
-/* But these were defined by ISO C without the first `_'.  */
+/* These were defined by ISO C without the first `_'.  */
 typedef        unsigned char u_int8_t;
 typedef        unsigned short int u_int16_t;
 typedef        unsigned int u_int32_t;
@@ -183,19 +172,9 @@ typedef int register_t;
 #else
 
 /* For GCC 2.7 and later, we can use specific type-size attributes.  */
-# define __intN_t(N, MODE) \
-  typedef int int##N##_t __attribute__ ((__mode__ (MODE)))
 # define __u_intN_t(N, MODE) \
   typedef unsigned int u_int##N##_t __attribute__ ((__mode__ (MODE)))
 
-# ifndef __int8_t_defined
-#  define __int8_t_defined
-__intN_t (8, __QI__);
-__intN_t (16, __HI__);
-__intN_t (32, __SI__);
-__intN_t (64, __DI__);
-# endif
-
 __u_intN_t (8, __QI__);
 __u_intN_t (16, __HI__);
 __u_intN_t (32, __SI__);
index f4eb1a7..936fab9 100644 (file)
@@ -25,7 +25,7 @@
 #include <features.h>
 
 #include <netinet/in.h>
-#include <stdint.h>
+#include <bits/stdint-uintn.h>
 #ifdef __USE_MISC
 /* This is necessary to make this include file properly replace the
    Sun version.  */
index 5751b5d..4206f25 100644 (file)
@@ -28,7 +28,8 @@ headers       := stdlib.h bits/stdlib.h bits/stdlib-ldbl.h bits/stdlib-float.h      \
           errno.h sys/errno.h bits/errno.h                                   \
           ucontext.h sys/ucontext.h                                          \
           alloca.h fmtmsg.h                                                  \
-          bits/stdlib-bsearch.h sys/random.h
+          bits/stdlib-bsearch.h sys/random.h bits/stdint-intn.h              \
+          bits/stdint-uintn.h
 
 routines       :=                                                            \
        atof atoi atol atoll                                                  \
index 13790e3..b553c52 100644 (file)
 /* Exact integral types.  */
 
 /* Signed.  */
-
-/* There is some amount of overlap with <sys/types.h> as known by inet code */
-#ifndef __int8_t_defined
-# define __int8_t_defined
-typedef signed char            int8_t;
-typedef short int              int16_t;
-typedef int                    int32_t;
-# if __WORDSIZE == 64
-typedef long int               int64_t;
-# else
-__extension__
-typedef long long int          int64_t;
-# endif
-#endif
+#include <bits/stdint-intn.h>
 
 /* Unsigned.  */
-typedef unsigned char          uint8_t;
-typedef unsigned short int     uint16_t;
-#ifndef __uint32_t_defined
-typedef unsigned int           uint32_t;
-# define __uint32_t_defined
-#endif
-#if __WORDSIZE == 64
-typedef unsigned long int      uint64_t;
-#else
-__extension__
-typedef unsigned long long int uint64_t;
-#endif
+#include <bits/stdint-uintn.h>
 
 
 /* Small types.  */