mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-30 00:31:08 +00:00
78880cc185
After some discussion in libc-alpha about this POSIX compliance fix, I see that GLIBC should indeed revert back to previous definition of msghdr and cmsghdr and implementation of sendmsg, recvmsg, sendmmsg, recvmmsg due some reasons: * The possible issue where the syscalls wrapper add the compatibility layer is quite limited in scope and range. And kernel current also add some limits to the values on the internal msghdr and cmsghdr fields: - msghdr::msg_iovlen larger than UIO_MAXIOV (1024) returns EMSGSIZE. - msghdr::msg_controllen larger than INT_MAX returns ENOBUFS. * There is a small performance hit for recvmsg/sendmsg/recmmsg which is neglectable, but it is a big hit for sendmmsg since now instead of calling the syscall for the packed structure, GLIBC is calling multiple sendmsg. This defeat the very existence of the syscall. * It currently breaks libsanitizer build on GCC [1] (I fixed on compiler-rt). However the fix is incomplete because it does add any runtime check since libsanitizer currently does not have any facility to intercept symbols with multiple version [2]. This, along with incorret dlsym/dlvsym return for versioned symbol due another bug [3], makes hard to interpose versioned symbols. Also, current approach of fixing GCC PR#71445 leads to half-baked solutions without versioned symbol interposing. This patch basically reverts commits2f0dc39029
,222c2d7f43
,af7f7c7ec8
. I decided to not revertabf29edd4a
(Adjust kernel-features.h defaults for recvmsg and sendmsg) mainly because it does not really address the POSIX compliance original issue and also adds some cleanups. Tested on x86, i386, s390, s390x, aarch64, and powerpc64le. [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71445 [2] https://github.com/google/sanitizers/issues/628 [3] https://sourceware.org/bugzilla/show_bug.cgi?id=14932 * conform/data/sys/socket.h-data (msghdr.msg_iovlen): Add xfail-. (msghdr.msg_controllen): Likewise. (cmsghdr.cmsg_len): Likewise. * nptl/Makefile (libpthread-routines): Remove ptw-oldrecvmsg and ptw-oldsendmsg. (CFLAGS-oldrecvmsg.c): Remove rule. (CFLAGS-oldsendmsg.c): Likewise. (CFLAGS-recvmsg.c): Add rule. (CFLAGS-sendmsg.c): Likewise. * sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Remove oldrecvmsg, oldsendmsg, oldrecvmmsg, oldsendmmsg. (CFLAGS-recvmsg.c): Remove rule. (CFLAGS-sendmsg.c): Likewise. (CFLAGS-oldrecvmsg.c): Likewise. (CFLAGS-oldsendmsg.c): Likewise. (CFLAGS-recvmmsg.c): Likewise. * sysdeps/unix/sysv/linux/bits/socket.h (msghdr.msg_iovlen): Revert to kernel defined interfaces. (msghdr.msg_controllen): Likewise. (cmsghdr.cmsg_len): Likewise. (msghdr.__glibc_reserved1): Remove member. (msghdr.__glibc_reserved2): Likewise. (cmsghdr.__glibc_reserved1): Likewise. * sysdeps/unix/sysv/linux/oldrecvmmsg.c: Remove file. * sysdeps/unix/sysv/linux/oldrecvmsg.c: Likewise. * sysdeps/unix/sysv/linux/oldsendmmsg.c: Likewise. * sysdeps/unix/sysv/linux/oldsendmsg.c: Likewise. * sysdeps/unix/sysv/linux/recvmmsg.c: Revert back to previous version. * sysdeps/unix/sysv/linux/recvmsg.c: Likewise. * sysdeps/unix/sysv/linux/sendmmsg.c: Likewise. * sysdeps/unix/sysv/linux/sendmsg.c: Likewise. * sysdeps/unix/sysv/linux/aarch64/Versions [libc] (GLIBC_2.24): Remove recvmsg and sendmsg. * sysdeps/unix/sysv/linux/alpha/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/hppa/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/i386/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/m68k/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/microblaze/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/mips/mips32/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n32/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/nios2/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/powerpc/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/sh/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/sparc/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/tile/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/x86_64/Versions [libc] (GLIBC_2.24): Likewise. * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/Versions: Remove file * sysdeps/unix/sysv/linux/x86_64/64/Versions: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/Versions: Likewise. * sysdeps/unix/sysv/linux/aarch64/libc.abilist: Remove new 2.24 version for {recv,send,recm,sendm}msg. * sysdeps/unix/sysv/linux/alpha/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/arm/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/hppa/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/i386/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/ia64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/microblaze/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/nios2/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/x86_64/64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Likewise.
140 lines
3.1 KiB
Plaintext
140 lines
3.1 KiB
Plaintext
#if !defined ISO && !defined ISO99 && !defined ISO11 && !defined POSIX && !defined XPG3
|
|
type socklen_t
|
|
|
|
type sa_family_t
|
|
|
|
# if defined XOPEN2K8 || defined POSIX2008
|
|
type size_t
|
|
type ssize_t
|
|
# endif
|
|
|
|
type {struct sockaddr}
|
|
|
|
element {struct sockaddr} sa_family_t sa_family
|
|
element {struct sockaddr} char sa_data []
|
|
|
|
type {struct sockaddr_storage}
|
|
|
|
element {struct sockaddr_storage} sa_family_t ss_family
|
|
|
|
type {struct msghdr}
|
|
|
|
element {struct msghdr} {void*} msg_name
|
|
element {struct msghdr} socklen_t msg_namelen
|
|
element {struct msghdr} {struct iovec*} msg_iov
|
|
// Bug 16919: wrong type for msg_iovlen and msg_controllen members.
|
|
xfail-element {struct msghdr} int msg_iovlen
|
|
element {struct msghdr} {void*} msg_control
|
|
xfail-element {struct msghdr} socklen_t msg_controllen
|
|
element {struct msghdr} int msg_flags
|
|
|
|
type {struct iovec}
|
|
|
|
element {struct iovec} {void*} iov_base
|
|
element {struct iovec} size_t iov_len
|
|
|
|
type {struct cmsghdr}
|
|
|
|
// Bug 16919: wrong type for cmsg_len member.
|
|
xfail-element {struct cmsghdr} socklen_t cmsg_len
|
|
element {struct cmsghdr} int cmsg_level
|
|
element {struct cmsghdr} int cmsg_type
|
|
|
|
macro SCM_RIGHTS
|
|
|
|
macro CMSG_DATA
|
|
macro CMSG_NXTHDR
|
|
macro CMSG_FIRSTHDR
|
|
|
|
type {struct linger}
|
|
|
|
element {struct linger} int l_onoff
|
|
element {struct linger} int l_linger
|
|
|
|
macro SOCK_DGRAM
|
|
macro SOCK_STREAM
|
|
macro SOCK_SEQPACKET
|
|
|
|
macro SOL_SOCKET
|
|
|
|
macro SO_ACCEPTCONN
|
|
macro SO_BROADCAST
|
|
macro SO_DEBUG
|
|
macro SO_DONTROUTE
|
|
macro SO_ERROR
|
|
macro SO_KEEPALIVE
|
|
macro SO_LINGER
|
|
macro SO_OOBINLINE
|
|
macro SO_RCVBUF
|
|
macro SO_RCVLOWAT
|
|
macro SO_RCVTIMEO
|
|
macro SO_REUSEADDR
|
|
macro SO_SNDBUF
|
|
macro SO_SNDLOWAT
|
|
macro SO_SNDTIMEO
|
|
macro SO_TYPE
|
|
|
|
macro SOMAXCONN
|
|
|
|
macro MSG_CTRUNC
|
|
macro MSG_DONTROUTE
|
|
macro MSG_EOR
|
|
macro MSG_OOB
|
|
macro MSG_PEEK
|
|
macro MSG_TRUNC
|
|
macro MSG_WAITALL
|
|
# if defined XOPEN2K8 || defined POSIX2008
|
|
constant MSG_NOSIGNAL
|
|
# endif
|
|
|
|
macro AF_UNIX
|
|
macro AF_UNSPEC
|
|
macro AF_INET
|
|
macro AF_INET6
|
|
|
|
macro SHUT_RD
|
|
macro SHUT_WR
|
|
macro SHUT_RDWR
|
|
|
|
function int accept (int, struct sockaddr*, socklen_t*)
|
|
function int bind (int, const struct sockaddr*, socklen_t)
|
|
function int connect (int, const struct sockaddr*, socklen_t)
|
|
function int getpeername (int, struct sockaddr*, socklen_t*)
|
|
function int getsockname (int, struct sockaddr*, socklen_t*)
|
|
function int getsockopt (int, int, int, void*, socklen_t*)
|
|
function int listen (int, int)
|
|
function ssize_t recv (int, void*, size_t, int)
|
|
function ssize_t recvfrom (int, void*, size_t, int, struct sockaddr*, socklen_t*)
|
|
function ssize_t recvmsg (int, struct msghdr*, int)
|
|
function ssize_t send (int, const void*, size_t, int)
|
|
function ssize_t sendmsg (int, const struct msghdr*, int)
|
|
function ssize_t sendto (int, const void*, size_t, int, const struct sockaddr*, socklen_t)
|
|
function int setsockopt (int, int, int, const void*, socklen_t)
|
|
function int shutdown (int, int)
|
|
function int socket (int, int, int)
|
|
function int socketpair (int, int, int, int[2])
|
|
#if !defined XPG4 && !defined UNIX98
|
|
function int sockatmark (int)
|
|
#endif
|
|
|
|
allow-header sys/uio.h
|
|
|
|
allow ss_*
|
|
allow sa_*
|
|
allow if_*
|
|
allow ifc_*
|
|
allow ifru_*
|
|
allow infu_*
|
|
allow ifra_*
|
|
allow msg_*
|
|
allow cmsg_*
|
|
allow l_*
|
|
allow SO*
|
|
allow AF_*
|
|
allow CMSG_*
|
|
allow MSG_*
|
|
allow PF_*
|
|
allow SCM_*
|
|
allow SHUT_*
|
|
#endif
|