diff options
author | Florian Weimer <fweimer@redhat.com> | 2019-07-18 20:19:39 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2019-07-21 22:31:33 +0200 |
commit | 87a66e30606ab0e2e45e17eaa862e83dc6013ed6 (patch) | |
tree | f7006cc5801fbbae6a353bf93746f4b649613727 | |
parent | 719d81f129206d51bf168076ed1578e7414c2506 (diff) | |
download | glibc-87a66e30606ab0e2e45e17eaa862e83dc6013ed6.tar.gz glibc-87a66e30606ab0e2e45e17eaa862e83dc6013ed6.tar.xz glibc-87a66e30606ab0e2e45e17eaa862e83dc6013ed6.zip |
Linux: Use in-tree copy of SO_ constants for !__USE_MISC [BZ #24532]
The kernel changes for a 64-bit time_t on 32-bit architectures resulted in <asm/socket.h> indirectly including <linux/posix_types.h>. The latter is not namespace-clean for the POSIX version of <sys/socket.h>. This issue has persisted across several Linux releases, so this commit creates our own copy of the SO_* definitions for !__USE_MISC mode. The new test socket/tst-socket-consts ensures that the copy is consistent with the kernel definitions (which vary across architectures). The test is tricky to get right because CPPFLAGS includes include/libc-symbols.h, which in turn defines _GNU_SOURCE unconditionally. Tested with build-many-glibcs.py. I verified that a discrepancy in the definitions actually results in a failure of the socket/tst-socket-consts test.
-rw-r--r-- | ChangeLog | 22 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/Makefile | 14 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h | 38 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/socket-constants.h | 38 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/socket.h | 98 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h | 38 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/mips/bits/socket-constants.h | 38 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h | 38 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h | 38 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/tst-socket-consts.py | 65 |
10 files changed, 333 insertions, 94 deletions
diff --git a/ChangeLog b/ChangeLog index fb14c32c43..25dfc442e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2019-07-18 Florian Weimer <fweimer@redhat.com> + + [BZ #24532] + Linux: Use in-tree copy of SO_ constants for !__USE_MISC. + * sysdeps/unix/sysv/linux/Makefile [$(subdir) == socket] + (sysdep_headers): Add bits/socket-constants.h. + (tests-special): Add tst-socket-consts.out. + (tst-socket-consts.out): New target. + * sysdeps/unix/sysv/linux/bits/socket.h: Remove macro tracking + around <asm/unistd.h>. + [__USE_MISC]: Include <bits/types/time_t.h> before <asm/socket.h>. + [!__USE_MISC]: Include <sys/socket-constants.h> instead of + <asm/socket.h>. + * sysdeps/unix/sysv/linux/bits/tst-socket-consts.py: New file. + * sysdeps/unix/sysv/linux/bits/socket-constants.h: Likewise. + * sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h: Likewise. + * sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h: Likewise. + * sysdeps/unix/sysv/linux/mips/bits/socket-constants.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h: + Likewise. + * sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h: Likewise. + 2019-07-20 Florian Weimer <fweimer@redhat.com> * scripts/glibcextract.py (compute_c_consts): Print source code on diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index afcdc658b5..1ab6bcbfc8 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -146,11 +146,21 @@ endif ifeq ($(subdir),socket) sysdep_headers += net/if_ppp.h net/ppp-comp.h \ net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \ - net/if_slip.h net/if_packet.h net/if_shaper.h + net/if_slip.h net/if_packet.h net/if_shaper.h \ + bits/socket-constants.h sysdep_routines += cmsg_nxthdr CFLAGS-recvmmsg.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-sendmmsg.c = -fexceptions -fasynchronous-unwind-tables -endif + +tests-special += $(objpfx)tst-socket-consts.out +$(objpfx)tst-socket-consts.out: ../sysdeps/unix/sysv/linux/tst-socket-consts.py + PYTHONPATH=../scripts \ + $(PYTHON) ../sysdeps/unix/sysv/linux/tst-socket-consts.py \ + --cc="$(CC) $(patsubst -DMODULE_NAME=%, \ + -DMODULE_NAME=testsuite, \ + $(CPPFLAGS)) -D_ISOMAC" \ + < /dev/null > $@ 2>&1; $(evaluate-test) +endif # $(subdir) == socket ifeq ($(subdir),sunrpc) sysdep_headers += nfs/nfs.h diff --git a/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h b/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h new file mode 100644 index 0000000000..571196756e --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h @@ -0,0 +1,38 @@ +/* Socket constants which vary among Linux architectures. Version for alpha. + Copyright (C) 2019 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 _SYS_SOCKET_H +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead." +#endif + +#define SOL_SOCKET 65535 +#define SO_ACCEPTCONN 4116 +#define SO_BROADCAST 32 +#define SO_DONTROUTE 16 +#define SO_ERROR 4103 +#define SO_KEEPALIVE 8 +#define SO_LINGER 128 +#define SO_OOBINLINE 256 +#define SO_RCVBUF 4098 +#define SO_RCVLOWAT 4112 +#define SO_RCVTIMEO 4114 +#define SO_REUSEADDR 4 +#define SO_SNDBUF 4097 +#define SO_SNDLOWAT 4113 +#define SO_SNDTIMEO 4115 +#define SO_TYPE 4104 diff --git a/sysdeps/unix/sysv/linux/bits/socket-constants.h b/sysdeps/unix/sysv/linux/bits/socket-constants.h new file mode 100644 index 0000000000..b231342102 --- /dev/null +++ b/sysdeps/unix/sysv/linux/bits/socket-constants.h @@ -0,0 +1,38 @@ +/* Socket constants which vary among Linux architectures. + Copyright (C) 2019 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 _SYS_SOCKET_H +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead." +#endif + +#define SOL_SOCKET 1 +#define SO_ACCEPTCONN 30 +#define SO_BROADCAST 6 +#define SO_DONTROUTE 5 +#define SO_ERROR 4 +#define SO_KEEPALIVE 9 +#define SO_LINGER 13 +#define SO_OOBINLINE 10 +#define SO_RCVBUF 8 +#define SO_RCVLOWAT 18 +#define SO_RCVTIMEO 20 +#define SO_REUSEADDR 2 +#define SO_SNDBUF 7 +#define SO_SNDLOWAT 19 +#define SO_SNDTIMEO 21 +#define SO_TYPE 3 diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h index 99af01d2a4..082f8b9031 100644 --- a/sysdeps/unix/sysv/linux/bits/socket.h +++ b/sysdeps/unix/sysv/linux/bits/socket.h @@ -349,98 +349,12 @@ struct ucred }; #endif -/* Ugly workaround for unclean kernel headers. */ -#ifndef __USE_MISC -# ifndef FIOGETOWN -# define __SYS_SOCKET_H_undef_FIOGETOWN -# endif -# ifndef FIOSETOWN -# define __SYS_SOCKET_H_undef_FIOSETOWN -# endif -# ifndef SIOCATMARK -# define __SYS_SOCKET_H_undef_SIOCATMARK -# endif -# ifndef SIOCGPGRP -# define __SYS_SOCKET_H_undef_SIOCGPGRP -# endif -# ifndef SIOCGSTAMP -# define __SYS_SOCKET_H_undef_SIOCGSTAMP -# endif -# ifndef SIOCGSTAMPNS -# define __SYS_SOCKET_H_undef_SIOCGSTAMPNS -# endif -# ifndef SIOCSPGRP -# define __SYS_SOCKET_H_undef_SIOCSPGRP -# endif -#endif -#ifndef IOCSIZE_MASK -# define __SYS_SOCKET_H_undef_IOCSIZE_MASK -#endif -#ifndef IOCSIZE_SHIFT -# define __SYS_SOCKET_H_undef_IOCSIZE_SHIFT -#endif -#ifndef IOC_IN -# define __SYS_SOCKET_H_undef_IOC_IN -#endif -#ifndef IOC_INOUT -# define __SYS_SOCKET_H_undef_IOC_INOUT -#endif -#ifndef IOC_OUT -# define __SYS_SOCKET_H_undef_IOC_OUT -#endif - -/* Get socket manipulation related informations from kernel headers. */ -#include <asm/socket.h> - -#ifndef __USE_MISC -# ifdef __SYS_SOCKET_H_undef_FIOGETOWN -# undef __SYS_SOCKET_H_undef_FIOGETOWN -# undef FIOGETOWN -# endif -# ifdef __SYS_SOCKET_H_undef_FIOSETOWN -# undef __SYS_SOCKET_H_undef_FIOSETOWN -# undef FIOSETOWN -# endif -# ifdef __SYS_SOCKET_H_undef_SIOCATMARK -# undef __SYS_SOCKET_H_undef_SIOCATMARK -# undef SIOCATMARK -# endif -# ifdef __SYS_SOCKET_H_undef_SIOCGPGRP -# undef __SYS_SOCKET_H_undef_SIOCGPGRP -# undef SIOCGPGRP -# endif -# ifdef __SYS_SOCKET_H_undef_SIOCGSTAMP -# undef __SYS_SOCKET_H_undef_SIOCGSTAMP -# undef SIOCGSTAMP -# endif -# ifdef __SYS_SOCKET_H_undef_SIOCGSTAMPNS -# undef __SYS_SOCKET_H_undef_SIOCGSTAMPNS -# undef SIOCGSTAMPNS -# endif -# ifdef __SYS_SOCKET_H_undef_SIOCSPGRP -# undef __SYS_SOCKET_H_undef_SIOCSPGRP -# undef SIOCSPGRP -# endif -#endif -#ifdef __SYS_SOCKET_H_undef_IOCSIZE_MASK -# undef __SYS_SOCKET_H_undef_IOCSIZE_MASK -# undef IOCSIZE_MASK -#endif -#ifdef __SYS_SOCKET_H_undef_IOCSIZE_SHIFT -# undef __SYS_SOCKET_H_undef_IOCSIZE_SHIFT -# undef IOCSIZE_SHIFT -#endif -#ifdef __SYS_SOCKET_H_undef_IOC_IN -# undef __SYS_SOCKET_H_undef_IOC_IN -# undef IOC_IN -#endif -#ifdef __SYS_SOCKET_H_undef_IOC_INOUT -# undef __SYS_SOCKET_H_undef_IOC_INOUT -# undef IOC_INOUT -#endif -#ifdef __SYS_SOCKET_H_undef_IOC_OUT -# undef __SYS_SOCKET_H_undef_IOC_OUT -# undef IOC_OUT +#ifdef __USE_MISC +# include <bits/types/time_t.h> +# include <asm/socket.h> +#else +# define SO_DEBUG 1 +# include <bits/socket-constants.h> #endif /* Structure used to manipulate the SO_LINGER option. */ diff --git a/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h b/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h new file mode 100644 index 0000000000..0b652b81be --- /dev/null +++ b/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h @@ -0,0 +1,38 @@ +/* Socket constants which vary among Linux architectures. Version for hppa. + Copyright (C) 2019 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 _SYS_SOCKET_H +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead." +#endif + +#define SOL_SOCKET 65535 +#define SO_ACCEPTCONN 16412 +#define SO_BROADCAST 32 +#define SO_DONTROUTE 16 +#define SO_ERROR 4103 +#define SO_KEEPALIVE 8 +#define SO_LINGER 128 +#define SO_OOBINLINE 256 +#define SO_RCVBUF 4098 +#define SO_RCVLOWAT 4100 +#define SO_RCVTIMEO 4102 +#define SO_REUSEADDR 4 +#define SO_SNDBUF 4097 +#define SO_SNDLOWAT 4099 +#define SO_SNDTIMEO 4101 +#define SO_TYPE 4104 diff --git a/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h b/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h new file mode 100644 index 0000000000..2c504499cb --- /dev/null +++ b/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h @@ -0,0 +1,38 @@ +/* Socket constants which vary among Linux architectures. Version for MIPS. + Copyright (C) 2019 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 _SYS_SOCKET_H +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead." +#endif + +#define SOL_SOCKET 65535 +#define SO_ACCEPTCONN 4105 +#define SO_BROADCAST 32 +#define SO_DONTROUTE 16 +#define SO_ERROR 4103 +#define SO_KEEPALIVE 8 +#define SO_LINGER 128 +#define SO_OOBINLINE 256 +#define SO_RCVBUF 4098 +#define SO_RCVLOWAT 4100 +#define SO_RCVTIMEO 4102 +#define SO_REUSEADDR 4 +#define SO_SNDBUF 4097 +#define SO_SNDLOWAT 4099 +#define SO_SNDTIMEO 4101 +#define SO_TYPE 4104 diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h b/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h new file mode 100644 index 0000000000..6d4301b1fd --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h @@ -0,0 +1,38 @@ +/* Socket constants which vary among Linux architectures. Version for POWER. + Copyright (C) 2019 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 _SYS_SOCKET_H +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead." +#endif + +#define SOL_SOCKET 1 +#define SO_ACCEPTCONN 30 +#define SO_BROADCAST 6 +#define SO_DONTROUTE 5 +#define SO_ERROR 4 +#define SO_KEEPALIVE 9 +#define SO_LINGER 13 +#define SO_OOBINLINE 10 +#define SO_RCVBUF 8 +#define SO_RCVLOWAT 16 +#define SO_RCVTIMEO 18 +#define SO_REUSEADDR 2 +#define SO_SNDBUF 7 +#define SO_SNDLOWAT 17 +#define SO_SNDTIMEO 19 +#define SO_TYPE 3 diff --git a/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h b/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h new file mode 100644 index 0000000000..a663e11210 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h @@ -0,0 +1,38 @@ +/* Socket constants which vary among Linux architectures. Version for SPARC. + Copyright (C) 2019 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 _SYS_SOCKET_H +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead." +#endif + +#define SOL_SOCKET 65535 +#define SO_ACCEPTCONN 32768 +#define SO_BROADCAST 32 +#define SO_DONTROUTE 16 +#define SO_ERROR 4103 +#define SO_KEEPALIVE 8 +#define SO_LINGER 128 +#define SO_OOBINLINE 256 +#define SO_RCVBUF 4098 +#define SO_RCVLOWAT 2048 +#define SO_RCVTIMEO 8192 +#define SO_REUSEADDR 4 +#define SO_SNDBUF 4097 +#define SO_SNDLOWAT 4096 +#define SO_SNDTIMEO 16384 +#define SO_TYPE 4104 diff --git a/sysdeps/unix/sysv/linux/tst-socket-consts.py b/sysdeps/unix/sysv/linux/tst-socket-consts.py new file mode 100644 index 0000000000..ca2634110c --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-socket-consts.py @@ -0,0 +1,65 @@ +#!/usr/bin/python3 +# Test that glibc's sys/socket.h SO_* constants match the kernel's. +# Copyright (C) 2018-2019 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/>. + +import argparse +import sys + +import glibcextract + +def main(): + """The main entry point.""" + parser = argparse.ArgumentParser( + description="Test that glibc's sys/socket.h constants " + "match the kernel's.") + parser.add_argument('--cc', metavar='CC', + help='C compiler (including options) to use') + args = parser.parse_args() + + def check(define): + return glibcextract.compare_macro_consts( + source_1=define + '#include <sys/socket.h>\n', + # Some constants in <asm/socket.h> may depend on the size + # of pid_t or time_t. + source_2='#include <sys/types.h>\n' + '#include <asm/socket.h>\n', + cc=args.cc, + # We cannot compare all macros because some macros cannot + # be expanded as constants, and glibcextract currently is + # not able to isolate errors. + macro_re='SOL?_.*', + # <sys/socket.h> and <asm/socket.h> are not a good match. + # Most socket-related constants are not defined in any + # UAPI header. Check only the intersection of the macros + # in both headers. Regular tests ensure that expected + # macros for _GNU_SOURCE are present, and the conformance + # tests cover most of the other modes. + allow_extra_1=True, + allow_extra_2=True) + # _GNU_SOURCE is defined by include/libc-symbols.h, which is + # included by the --cc command. Defining _ISOMAC does not prevent + # that. + status = max( + check(''), + check('#undef _GNU_SOURCE\n'), + check('#undef _GNU_SOURCE\n' + '#define _POSIX_SOURCE 1\n')) + sys.exit(status) + +if __name__ == '__main__': + main() |