From 7854ebf8ed18180189c335f6f499fe9322458f0b Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Wed, 24 Jul 2019 10:59:34 +0200 Subject: 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 indirectly including . The latter is not namespace-clean for the POSIX version of . 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. --- sysdeps/unix/sysv/linux/tst-socket-consts.py | 65 ++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/tst-socket-consts.py (limited to 'sysdeps/unix/sysv/linux/tst-socket-consts.py') 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 +# . + +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 \n', + # Some constants in may depend on the size + # of pid_t or time_t. + source_2='#include \n' + '#include \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?_.*', + # and 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() -- cgit v1.2.3-70-g09d2