Compare commits

...
Author SHA1 Message Date
Florian Weimer d5873c6e79 nptl: Use uintptr_t for address diagnostic in nptl/tst-pthread-getattr
Recent GCC versions warn about the attempt to return the address of a
local variable:

tst-pthread-getattr.c: In function ‘allocate_and_test’:
tst-pthread-getattr.c:54:10: error: function returns address of local variable [-Werror=return-local-addr]
   54 |   return mem;
      |          ^~~
In file included from ../include/alloca.h:3,
                 from tst-pthread-getattr.c:26:
../stdlib/alloca.h:35:23: note: declared here
   35 | # define alloca(size) __builtin_alloca (size)
      |                       ^~~~~~~~~~~~~~~~~~~~~~~
tst-pthread-getattr.c:51:9: note: in expansion of macro ‘alloca’
   51 |   mem = alloca ((size_t) (mem - target));
      |         ^~~~~~

The address itself is used in a check in the caller, so using
uintptr_t instead is reasonable.
2019-07-22 14:02:40 +02:00
Florian Weimer c1d1e0c9f2 Linux: Include <linux/sockios.h> in <bits/socket.h> under __USE_MISC
Historically, <asm/socket.h> (which is included from <bits/socket.h>)
provided ioctl operations for sockets.  User code accessed them
through <sys/socket.h>.  The kernel UAPI headers have removed these
definitions in favor of <linux/sockios.h>.  This commit makes them
available via <sys/socket.h> again.
2019-07-22 11:01:17 +02:00
Florian Weimer 3d03282e66 build-many-glibcs.py: Use Linux 5.2 by default 2019-07-21 22:31:33 +02:00
Florian Weimer 87a66e3060 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.
2019-07-21 22:31:33 +02:00
Florian Weimer 719d81f129 scripts/glibcextract.py: Print source code on compiler failure 2019-07-21 22:31:33 +02:00
13 changed files with 367 additions and 102 deletions
+43
View File
@@ -1,3 +1,46 @@
2019-07-22 Florian Weimer <fweimer@redhat.com>
* nptl/tst-pthread-getattr.c (allocate_and_test): Change return
type to uintptr_t.
(check_stack_top): Adjust.
2019-07-22 Florian Weimer <fweimer@redhat.com>
* sysdeps/unix/sysv/linux/bits/socket.h [__USE_MISC]: Include
<linux/sockios.h>.
2019-07-18 Florian Weimer <fweimer@redhat.com>
* scripts/build-many-glibcs.py (Context.checkout): Default to
Linux 5.2.
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
compiler failure.
2019-07-20 Egor Kobylkin <egor@kobylkin.com>
[BZ #2872]
+5 -6
View File
@@ -43,7 +43,7 @@ static size_t pagesize;
/* Check if the page in which TARGET lies is accessible. This will segfault
if it fails. */
static volatile char *
static volatile uintptr_t
allocate_and_test (char *target)
{
volatile char *mem = (char *) &mem;
@@ -51,7 +51,7 @@ allocate_and_test (char *target)
mem = alloca ((size_t) (mem - target));
*mem = 42;
return mem;
return (uintptr_t) mem;
}
static int
@@ -84,7 +84,6 @@ check_stack_top (void)
{
struct rlimit stack_limit;
void *stackaddr;
volatile void *mem;
size_t stacksize = 0;
int ret;
uintptr_t pagemask = ~(pagesize - 1);
@@ -130,14 +129,14 @@ check_stack_top (void)
stack and test access there. It is however sufficient to simply check if
the top page is accessible, so we target our access halfway up the top
page. Thanks Chris Metcalf for this idea. */
mem = allocate_and_test (stackaddr + pagesize / 2);
uintptr_t mem = allocate_and_test (stackaddr + pagesize / 2);
/* Before we celebrate, make sure we actually did test the same page. */
if (((uintptr_t) stackaddr & pagemask) != ((uintptr_t) mem & pagemask))
if (((uintptr_t) stackaddr & pagemask) != (mem & pagemask))
{
printf ("We successfully wrote into the wrong page.\n"
"Expected %#" PRIxPTR ", but got %#" PRIxPTR "\n",
(uintptr_t) stackaddr & pagemask, (uintptr_t) mem & pagemask);
(uintptr_t) stackaddr & pagemask, mem & pagemask);
return 1;
}
+1 -1
View File
@@ -707,7 +707,7 @@ class Context(object):
'gcc': 'vcs-9',
'glibc': 'vcs-mainline',
'gmp': '6.1.2',
'linux': '5.0',
'linux': '5.2',
'mpc': '1.1.0',
'mpfr': '4.0.2',
'mig': 'vcs-mainline',
+6 -1
View File
@@ -59,7 +59,12 @@ def compute_c_consts(sym_data, cc):
# Compilation has to be from stdin to avoid the temporary file
# name being written into the generated dependencies.
cmd = ('%s -S -o %s -x c - < %s' % (cc, s_file_name, c_file_name))
subprocess.check_call(cmd, shell=True)
try:
subprocess.check_call(cmd, shell=True)
except:
print("Source code failed to compile:")
print(out_text)
raise
consts = {}
with open(s_file_name, 'r') as s_file:
for line in s_file:
+12 -2
View File
@@ -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
@@ -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
@@ -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
+7 -92
View File
@@ -349,98 +349,13 @@ 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>
# include <linux/sockios.h>
#else
# define SO_DEBUG 1
# include <bits/socket-constants.h>
#endif
/* Structure used to manipulate the SO_LINGER option. */
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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()