diff options
author | Florian Weimer <fweimer@redhat.com> | 2019-07-24 10:59:34 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2019-07-24 10:59:34 +0200 |
commit | 7854ebf8ed18180189c335f6f499fe9322458f0b (patch) | |
tree | d60e166b1843c7cd1de0d0959f94c8fcaaadd7d0 /sysdeps/unix/sysv/linux/tst-socket-consts.py | |
parent | 35e038c1d2ccb3a75395662f9c4f28d85a61444f (diff) | |
download | glibc-7854ebf8ed18180189c335f6f499fe9322458f0b.tar glibc-7854ebf8ed18180189c335f6f499fe9322458f0b.tar.gz glibc-7854ebf8ed18180189c335f6f499fe9322458f0b.tar.bz2 glibc-7854ebf8ed18180189c335f6f499fe9322458f0b.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.
Diffstat (limited to 'sysdeps/unix/sysv/linux/tst-socket-consts.py')
-rw-r--r-- | sysdeps/unix/sysv/linux/tst-socket-consts.py | 65 |
1 files changed, 65 insertions, 0 deletions
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() |