mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Revert {send,sendm,recv,recvm}msg conformance changes
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.
This commit is contained in:
102
ChangeLog
102
ChangeLog
@ -1,3 +1,105 @@
|
|||||||
|
2016-06-10 Adhemerval Zanela <adhemerval.zanella@linaro.org>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2016-06-10 Florian Weimer <fweimer@redhat.com>
|
2016-06-10 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
[BZ #19564]
|
[BZ #19564]
|
||||||
|
@ -22,9 +22,10 @@ type {struct msghdr}
|
|||||||
element {struct msghdr} {void*} msg_name
|
element {struct msghdr} {void*} msg_name
|
||||||
element {struct msghdr} socklen_t msg_namelen
|
element {struct msghdr} socklen_t msg_namelen
|
||||||
element {struct msghdr} {struct iovec*} msg_iov
|
element {struct msghdr} {struct iovec*} msg_iov
|
||||||
element {struct msghdr} int msg_iovlen
|
// Bug 16919: wrong type for msg_iovlen and msg_controllen members.
|
||||||
|
xfail-element {struct msghdr} int msg_iovlen
|
||||||
element {struct msghdr} {void*} msg_control
|
element {struct msghdr} {void*} msg_control
|
||||||
element {struct msghdr} socklen_t msg_controllen
|
xfail-element {struct msghdr} socklen_t msg_controllen
|
||||||
element {struct msghdr} int msg_flags
|
element {struct msghdr} int msg_flags
|
||||||
|
|
||||||
type {struct iovec}
|
type {struct iovec}
|
||||||
@ -34,7 +35,8 @@ element {struct iovec} size_t iov_len
|
|||||||
|
|
||||||
type {struct cmsghdr}
|
type {struct cmsghdr}
|
||||||
|
|
||||||
element {struct cmsghdr} socklen_t cmsg_len
|
// 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_level
|
||||||
element {struct cmsghdr} int cmsg_type
|
element {struct cmsghdr} int cmsg_type
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ libpthread-routines = nptl-init vars events version pt-interp \
|
|||||||
ptw-pread ptw-pread64 ptw-pwrite ptw-pwrite64 \
|
ptw-pread ptw-pread64 ptw-pwrite ptw-pwrite64 \
|
||||||
ptw-tcdrain ptw-wait ptw-waitpid ptw-msgrcv ptw-msgsnd \
|
ptw-tcdrain ptw-wait ptw-waitpid ptw-msgrcv ptw-msgsnd \
|
||||||
ptw-sigwait ptw-sigsuspend \
|
ptw-sigwait ptw-sigsuspend \
|
||||||
ptw-oldrecvmsg ptw-oldsendmsg \
|
ptw-recvmsg ptw-sendmsg \
|
||||||
pt-raise pt-system \
|
pt-raise pt-system \
|
||||||
flockfile ftrylockfile funlockfile \
|
flockfile ftrylockfile funlockfile \
|
||||||
sigaction \
|
sigaction \
|
||||||
@ -207,8 +207,8 @@ CFLAGS-accept.c = -fexceptions -fasynchronous-unwind-tables
|
|||||||
CFLAGS-sendto.c = -fexceptions -fasynchronous-unwind-tables
|
CFLAGS-sendto.c = -fexceptions -fasynchronous-unwind-tables
|
||||||
CFLAGS-connect.c = -fexceptions -fasynchronous-unwind-tables
|
CFLAGS-connect.c = -fexceptions -fasynchronous-unwind-tables
|
||||||
CFLAGS-recvfrom.c = -fexceptions -fasynchronous-unwind-tables
|
CFLAGS-recvfrom.c = -fexceptions -fasynchronous-unwind-tables
|
||||||
CFLAGS-oldrecvmsg.c = -fexceptions -fasynchronous-unwind-tables
|
CFLAGS-recvmsg.c = -fexceptions -fasynchronous-unwind-tables
|
||||||
CFLAGS-oldsendmsg.c = -fexceptions -fasynchronous-unwind-tables
|
CFLAGS-sendmsg.c = -fexceptions -fasynchronous-unwind-tables
|
||||||
|
|
||||||
CFLAGS-pt-system.c = -fexceptions
|
CFLAGS-pt-system.c = -fexceptions
|
||||||
|
|
||||||
|
@ -124,12 +124,9 @@ ifeq ($(subdir),socket)
|
|||||||
sysdep_headers += net/if_ppp.h net/ppp-comp.h \
|
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/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
|
||||||
sysdep_routines += cmsg_nxthdr oldrecvmsg oldsendmsg \
|
sysdep_routines += cmsg_nxthdr
|
||||||
oldrecvmmsg oldsendmmsg
|
CFLAGS-recvmmsg.c = -fexceptions -fasynchronous-unwind-tables
|
||||||
CFLAGS-recvmsg.c = -fexceptions -fasynchronous-unwind-tables
|
CFLAGS-sendmmsg.c = -fexceptions -fasynchronous-unwind-tables
|
||||||
CFLAGS-sendmsg.c = -fexceptions -fasynchronous-unwind-tables
|
|
||||||
CFLAGS-oldrecvmsg.c = -fexceptions -fasynchronous-unwind-tables
|
|
||||||
CFLAGS-oldsendmsg.c = -fexceptions -fasynchronous-unwind-tables
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(subdir),sunrpc)
|
ifeq ($(subdir),sunrpc)
|
||||||
|
@ -5,10 +5,6 @@ ld {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
libc {
|
libc {
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
GLIBC_PRIVATE {
|
GLIBC_PRIVATE {
|
||||||
__vdso_clock_gettime;
|
__vdso_clock_gettime;
|
||||||
__vdso_clock_getres;
|
__vdso_clock_getres;
|
||||||
|
@ -2089,7 +2089,3 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmmsg F
|
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
|
@ -85,9 +85,6 @@ libc {
|
|||||||
#errlist-compat 140
|
#errlist-compat 140
|
||||||
_sys_errlist; sys_errlist; _sys_nerr; sys_nerr;
|
_sys_errlist; sys_errlist; _sys_nerr; sys_nerr;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
GLIBC_PRIVATE {
|
GLIBC_PRIVATE {
|
||||||
__libc_alpha_cache_shape;
|
__libc_alpha_cache_shape;
|
||||||
}
|
}
|
||||||
|
@ -2000,10 +2000,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmmsg F
|
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -90,8 +90,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.4 GLIBC_2.4 A
|
GLIBC_2.4 GLIBC_2.4 A
|
||||||
GLIBC_2.4 _Exit F
|
GLIBC_2.4 _Exit F
|
||||||
GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
|
GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
|
||||||
|
@ -27,8 +27,6 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <endian.h>
|
|
||||||
#include <bits/wordsize.h>
|
|
||||||
|
|
||||||
/* Type for length arguments in socket calls. */
|
/* Type for length arguments in socket calls. */
|
||||||
#ifndef __socklen_t_defined
|
#ifndef __socklen_t_defined
|
||||||
@ -252,32 +250,13 @@ struct msghdr
|
|||||||
socklen_t msg_namelen; /* Length of address data. */
|
socklen_t msg_namelen; /* Length of address data. */
|
||||||
|
|
||||||
struct iovec *msg_iov; /* Vector of data to send/receive into. */
|
struct iovec *msg_iov; /* Vector of data to send/receive into. */
|
||||||
#if __WORDSIZE == 64
|
size_t msg_iovlen; /* Number of elements in the vector. */
|
||||||
# if __BYTE_ORDER == __BIG_ENDIAN
|
|
||||||
int __glibc_reserved1; /* Pad to adjust Linux size to POSIX defined
|
|
||||||
size for msg_iovlen. */
|
|
||||||
int msg_iovlen; /* Number of elements in the vector. */
|
|
||||||
# else
|
|
||||||
int msg_iovlen;
|
|
||||||
int __glibc_reserved1;
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
int msg_iovlen;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void *msg_control; /* Ancillary data (eg BSD filedesc passing). */
|
void *msg_control; /* Ancillary data (eg BSD filedesc passing). */
|
||||||
#if __WORDSIZE == 64
|
size_t msg_controllen; /* Ancillary data buffer length.
|
||||||
# if __BYTE_ORDER == __BIG_ENDIAN
|
!! The type should be socklen_t but the
|
||||||
int __glibc_reserved2; /* Pad to adjust Linux size to POSIX defined
|
definition of the kernel is incompatible
|
||||||
size for msg_controllen. */
|
with this. */
|
||||||
socklen_t msg_controllen; /* Ancillary data buffer length. */
|
|
||||||
# else
|
|
||||||
socklen_t msg_controllen;
|
|
||||||
int __glibc_reserved2;
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
socklen_t msg_controllen;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int msg_flags; /* Flags on received message. */
|
int msg_flags; /* Flags on received message. */
|
||||||
};
|
};
|
||||||
@ -285,19 +264,11 @@ struct msghdr
|
|||||||
/* Structure used for storage of ancillary data object information. */
|
/* Structure used for storage of ancillary data object information. */
|
||||||
struct cmsghdr
|
struct cmsghdr
|
||||||
{
|
{
|
||||||
#if __WORDSIZE == 64
|
size_t cmsg_len; /* Length of data in cmsg_data plus length
|
||||||
# if __BYTE_ORDER == __BIG_ENDIAN
|
of cmsghdr structure.
|
||||||
int __glibc_reserved1; /* Pad toadjust Linux size to POSIX defined
|
!! The type should be socklen_t but the
|
||||||
size for cmsg_len. */
|
definition of the kernel is incompatible
|
||||||
socklen_t cmsg_len; /* Length of data in cmsg_data plus length
|
with this. */
|
||||||
of cmsghdr structure. */
|
|
||||||
# else
|
|
||||||
socklen_t cmsg_len;
|
|
||||||
int __glibc_reserved1;
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
socklen_t cmsg_len;
|
|
||||||
#endif
|
|
||||||
int cmsg_level; /* Originating protocol. */
|
int cmsg_level; /* Originating protocol. */
|
||||||
int cmsg_type; /* Protocol specific type. */
|
int cmsg_type; /* Protocol specific type. */
|
||||||
#if (!defined __STRICT_ANSI__ && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L
|
#if (!defined __STRICT_ANSI__ && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L
|
||||||
|
@ -35,7 +35,4 @@ libc {
|
|||||||
GLIBC_2.19 {
|
GLIBC_2.19 {
|
||||||
fanotify_mark;
|
fanotify_mark;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1854,8 +1854,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -45,9 +45,6 @@ libc {
|
|||||||
# f*
|
# f*
|
||||||
fallocate64;
|
fallocate64;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
GLIBC_PRIVATE {
|
GLIBC_PRIVATE {
|
||||||
__modify_ldt;
|
__modify_ldt;
|
||||||
}
|
}
|
||||||
|
@ -2012,8 +2012,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -1876,10 +1876,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmmsg F
|
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -40,9 +40,6 @@ libc {
|
|||||||
GLIBC_2.12 {
|
GLIBC_2.12 {
|
||||||
__m68k_read_tp;
|
__m68k_read_tp;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
GLIBC_PRIVATE {
|
GLIBC_PRIVATE {
|
||||||
__vdso_atomic_cmpxchg_32; __vdso_atomic_barrier;
|
__vdso_atomic_cmpxchg_32; __vdso_atomic_barrier;
|
||||||
}
|
}
|
||||||
|
@ -91,8 +91,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.4 GLIBC_2.4 A
|
GLIBC_2.4 GLIBC_2.4 A
|
||||||
GLIBC_2.4 _Exit F
|
GLIBC_2.4 _Exit F
|
||||||
GLIBC_2.4 _IO_2_1_stderr_ D 0x98
|
GLIBC_2.4 _IO_2_1_stderr_ D 0x98
|
||||||
|
@ -1968,8 +1968,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -2,7 +2,4 @@ libc {
|
|||||||
GLIBC_2.18 {
|
GLIBC_2.18 {
|
||||||
fallocate64;
|
fallocate64;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -2089,5 +2089,3 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
|
@ -3,7 +3,4 @@ libc {
|
|||||||
getrlimit64;
|
getrlimit64;
|
||||||
setrlimit64;
|
setrlimit64;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1943,8 +1943,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -1941,8 +1941,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -3,7 +3,4 @@ libc {
|
|||||||
getrlimit64;
|
getrlimit64;
|
||||||
setrlimit64;
|
setrlimit64;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1939,8 +1939,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
libc {
|
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1934,10 +1934,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmmsg F
|
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -3,7 +3,4 @@ libc {
|
|||||||
_flush_cache;
|
_flush_cache;
|
||||||
cacheflush;
|
cacheflush;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -2130,5 +2130,3 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
|
@ -1,87 +0,0 @@
|
|||||||
/* Compatibility version of recvmsg.
|
|
||||||
Copyright (C) 2010-2016 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/>. */
|
|
||||||
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sysdep-cancel.h>
|
|
||||||
#include <socketcall.h>
|
|
||||||
#include <shlib-compat.h>
|
|
||||||
|
|
||||||
#if __WORDSIZE == 64
|
|
||||||
# if SHLIB_COMPAT (libc, GLIBC_2_12, GLIBC_2_24)
|
|
||||||
|
|
||||||
/* Do not use the recvmmsg syscall on socketcall architectures unless
|
|
||||||
it was added at the same time as the socketcall support or can be
|
|
||||||
assumed to be present. */
|
|
||||||
# if defined __ASSUME_SOCKETCALL \
|
|
||||||
&& !defined __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL \
|
|
||||||
&& !defined __ASSUME_RECVMMSG_SYSCALL
|
|
||||||
# undef __NR_recvmmsg
|
|
||||||
# endif
|
|
||||||
|
|
||||||
int
|
|
||||||
__old_recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen,
|
|
||||||
int flags, struct timespec *tmo)
|
|
||||||
{
|
|
||||||
# ifdef __NR_recvmmsg
|
|
||||||
return SYSCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo);
|
|
||||||
# elif defined __NR_socketcall
|
|
||||||
# ifdef __ASSUME_RECVMMSG_SOCKETCALL
|
|
||||||
return SOCKETCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo);
|
|
||||||
# else
|
|
||||||
static int have_recvmmsg;
|
|
||||||
if (__glibc_likely (have_recvmmsg >= 0))
|
|
||||||
{
|
|
||||||
int ret = SOCKETCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags,
|
|
||||||
tmo);
|
|
||||||
/* The kernel returns -EINVAL for unknown socket operations.
|
|
||||||
We need to convert that error to an ENOSYS error. */
|
|
||||||
if (__builtin_expect (ret < 0, 0)
|
|
||||||
&& have_recvmmsg == 0
|
|
||||||
&& errno == EINVAL)
|
|
||||||
{
|
|
||||||
/* Try another call, this time with an invalid file
|
|
||||||
descriptor and all other parameters cleared. This call
|
|
||||||
will not cause any harm and it will return
|
|
||||||
immediately. */
|
|
||||||
ret = SOCKETCALL_CANCEL (invalid, -1);
|
|
||||||
if (errno == EINVAL)
|
|
||||||
{
|
|
||||||
have_recvmmsg = -1;
|
|
||||||
__set_errno (ENOSYS);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
have_recvmmsg = 1;
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
__set_errno (ENOSYS);
|
|
||||||
return -1;
|
|
||||||
# endif /* __ASSUME_RECVMMSG_SOCKETCALL */
|
|
||||||
# else
|
|
||||||
__set_errno (ENOSYS);
|
|
||||||
return -1;
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
compat_symbol (libc, __old_recvmmsg, recvmmsg, GLIBC_2_12);
|
|
||||||
|
|
||||||
# endif /* SHLIB_COMPAT (libc, GLIBC_2_12, GLIBC_2_24) */
|
|
||||||
#endif /* __WORDSIZE == 64 */
|
|
@ -1,40 +0,0 @@
|
|||||||
/* Compatibility version of recvmsg.
|
|
||||||
Copyright (C) 2016 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/>. */
|
|
||||||
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sysdep-cancel.h>
|
|
||||||
#include <socketcall.h>
|
|
||||||
#include <shlib-compat.h>
|
|
||||||
|
|
||||||
/* Both libc.so and libpthread.so provides sendmsg, so we need to
|
|
||||||
provide the compat symbol for both libraries. */
|
|
||||||
#if SHLIB_COMPAT (MODULE_NAME, GLIBC_2_0, GLIBC_2_24)
|
|
||||||
|
|
||||||
/* We can use the same struct layout for old symbol version since
|
|
||||||
size is the same. */
|
|
||||||
ssize_t
|
|
||||||
__old_recvmsg (int fd, struct msghdr *msg, int flags)
|
|
||||||
{
|
|
||||||
# ifdef __ASSUME_RECVMSG_SYSCALL
|
|
||||||
return SYSCALL_CANCEL (recvmsg, fd, msg, flags);
|
|
||||||
# else
|
|
||||||
return SOCKETCALL_CANCEL (recvmsg, fd, msg, flags);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
compat_symbol (MODULE_NAME, __old_recvmsg, recvmsg, GLIBC_2_0);
|
|
||||||
#endif
|
|
@ -1,76 +0,0 @@
|
|||||||
/* Compatibility implementation of sendmmsg.
|
|
||||||
Copyright (C) 2016 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/>. */
|
|
||||||
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sysdep-cancel.h>
|
|
||||||
#include <socketcall.h>
|
|
||||||
#include <shlib-compat.h>
|
|
||||||
|
|
||||||
#if __WORDSIZE == 64
|
|
||||||
# if SHLIB_COMPAT (libc, GLIBC_2_14, GLIBC_2_24)
|
|
||||||
|
|
||||||
int
|
|
||||||
__old_sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen,
|
|
||||||
int flags)
|
|
||||||
{
|
|
||||||
# ifdef __NR_sendmmsg
|
|
||||||
return SYSCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
|
|
||||||
# elif defined __NR_socketcall
|
|
||||||
# ifdef __ASSUME_SENDMMSG_SOCKETCALL
|
|
||||||
return SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
|
|
||||||
# else
|
|
||||||
static int have_sendmmsg;
|
|
||||||
if (__glibc_likely (have_sendmmsg >= 0))
|
|
||||||
{
|
|
||||||
int ret = SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
|
|
||||||
/* The kernel returns -EINVAL for unknown socket operations.
|
|
||||||
We need to convert that error to an ENOSYS error. */
|
|
||||||
if (__builtin_expect (ret < 0, 0)
|
|
||||||
&& have_sendmmsg == 0
|
|
||||||
&& errno == EINVAL)
|
|
||||||
{
|
|
||||||
/* Try another call, this time with an invalid file
|
|
||||||
descriptor and all other parameters cleared. This call
|
|
||||||
will not cause any harm and it will return
|
|
||||||
immediately. */
|
|
||||||
ret = SOCKETCALL_CANCEL (invalid, -1);
|
|
||||||
if (errno == EINVAL)
|
|
||||||
{
|
|
||||||
have_sendmmsg = -1;
|
|
||||||
__set_errno (ENOSYS);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
have_sendmmsg = 1;
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
__set_errno (ENOSYS);
|
|
||||||
return -1;
|
|
||||||
# endif /* __ASSUME_SENDMMSG_SOCKETCALL */
|
|
||||||
# else /* defined __NR_socketcall */
|
|
||||||
__set_errno (ENOSYS);
|
|
||||||
return -1;
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
compat_symbol (libc, __old_sendmmsg, sendmmsg, GLIBC_2_14);
|
|
||||||
# endif /* SHLIB_COMPAT (libc, GLIBC_2_14, GLIBC_2_24) */
|
|
||||||
#endif /* __WORDSIZE == 64 */
|
|
@ -1,40 +0,0 @@
|
|||||||
/* Compatibility implementation of sendmsg.
|
|
||||||
Copyright (C) 2016 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/>. */
|
|
||||||
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sysdep-cancel.h>
|
|
||||||
#include <socketcall.h>
|
|
||||||
#include <shlib-compat.h>
|
|
||||||
|
|
||||||
/* Both libc.so and libpthread.so provides sendmsg, so we need to
|
|
||||||
provide the compat symbol for both libraries. */
|
|
||||||
#if SHLIB_COMPAT (MODULE_NAME, GLIBC_2_0, GLIBC_2_24)
|
|
||||||
|
|
||||||
/* We can use the same struct layout for old symbol version since
|
|
||||||
size is the same. */
|
|
||||||
ssize_t
|
|
||||||
__old_sendmsg (int fd, const struct msghdr *msg, int flags)
|
|
||||||
{
|
|
||||||
# ifdef __ASSUME_SENDMSG_SYSCALL
|
|
||||||
return SYSCALL_CANCEL (sendmsg, fd, msg, flags);
|
|
||||||
# else
|
|
||||||
return SOCKETCALL_CANCEL (sendmsg, fd, msg, flags);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
compat_symbol (MODULE_NAME, __old_sendmsg, sendmsg, GLIBC_2_0);
|
|
||||||
#endif
|
|
@ -5,9 +5,6 @@ ld {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
libc {
|
libc {
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
GLIBC_PRIVATE {
|
GLIBC_PRIVATE {
|
||||||
__vdso_get_tbfreq;
|
__vdso_get_tbfreq;
|
||||||
__vdso_clock_gettime;
|
__vdso_clock_gettime;
|
||||||
|
@ -1972,8 +1972,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -1977,8 +1977,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -22,9 +22,6 @@ libc {
|
|||||||
GLIBC_2.17 {
|
GLIBC_2.17 {
|
||||||
__ppc_get_timebase_freq;
|
__ppc_get_timebase_freq;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
librt {
|
librt {
|
||||||
|
@ -2177,7 +2177,3 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmmsg F
|
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
|
@ -91,10 +91,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmmsg F
|
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 _Exit F
|
GLIBC_2.3 _Exit F
|
||||||
GLIBC_2.3 _IO_2_1_stderr_ D 0xe0
|
GLIBC_2.3 _IO_2_1_stderr_ D 0xe0
|
||||||
|
@ -16,10 +16,12 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <socketcall.h>
|
|
||||||
#include <sysdep-cancel.h>
|
#include <sysdep-cancel.h>
|
||||||
#include <shlib-compat.h>
|
#include <sys/syscall.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
|
|
||||||
/* Do not use the recvmmsg syscall on socketcall architectures unless
|
/* Do not use the recvmmsg syscall on socketcall architectures unless
|
||||||
it was added at the same time as the socketcall support or can be
|
it was added at the same time as the socketcall support or can be
|
||||||
@ -30,39 +32,31 @@
|
|||||||
# undef __NR_recvmmsg
|
# undef __NR_recvmmsg
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline void
|
#ifdef __NR_recvmmsg
|
||||||
adjust_mmsghdr (struct mmsghdr *vmessages, unsigned int vlen)
|
int
|
||||||
|
recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
|
||||||
|
struct timespec *tmo)
|
||||||
{
|
{
|
||||||
#if __WORDSIZE == 64
|
return SYSCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo);
|
||||||
/* POSIX specifies that both msghdr::msg_iovlen and msghdr::msg_controllen
|
|
||||||
to be int and socklen_t respectively. However Linux defines it as
|
|
||||||
both size_t. So for 64-bit it requires some adjustments by zeroing
|
|
||||||
the pad fields. */
|
|
||||||
struct mmsghdr *vmhdr = vmessages;
|
|
||||||
for (unsigned int i = 0; i != 0; i--, vmhdr++)
|
|
||||||
{
|
|
||||||
vmhdr->msg_hdr.__glibc_reserved1 = 0;
|
|
||||||
vmhdr->msg_hdr.__glibc_reserved2 = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#elif defined __NR_socketcall
|
||||||
|
# include <socketcall.h>
|
||||||
|
# ifdef __ASSUME_RECVMMSG_SOCKETCALL
|
||||||
|
int
|
||||||
|
recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
|
||||||
|
struct timespec *tmo)
|
||||||
|
{
|
||||||
|
return SOCKETCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo);
|
||||||
|
}
|
||||||
|
# else
|
||||||
|
static int have_recvmmsg;
|
||||||
|
|
||||||
int
|
int
|
||||||
__recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen,
|
recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
|
||||||
int flags, struct timespec *tmo)
|
struct timespec *tmo)
|
||||||
{
|
{
|
||||||
#ifdef __NR_recvmmsg
|
|
||||||
adjust_mmsghdr (vmessages, vlen);
|
|
||||||
return SYSCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo);
|
|
||||||
#elif defined __NR_socketcall
|
|
||||||
# ifdef __ASSUME_RECVMMSG_SOCKETCALL
|
|
||||||
adjust_mmsghdr (vmessages, vlen);
|
|
||||||
return SOCKETCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo);
|
|
||||||
# else
|
|
||||||
static int have_recvmmsg;
|
|
||||||
if (__glibc_likely (have_recvmmsg >= 0))
|
if (__glibc_likely (have_recvmmsg >= 0))
|
||||||
{
|
{
|
||||||
adjust_mmsghdr (vmessages, vlen);
|
|
||||||
int ret = SOCKETCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags,
|
int ret = SOCKETCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags,
|
||||||
tmo);
|
tmo);
|
||||||
/* The kernel returns -EINVAL for unknown socket operations.
|
/* The kernel returns -EINVAL for unknown socket operations.
|
||||||
@ -92,19 +86,8 @@ __recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen,
|
|||||||
}
|
}
|
||||||
__set_errno (ENOSYS);
|
__set_errno (ENOSYS);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
# endif /* __ASSUME_RECVMMSG_SOCKETCALL */
|
# endif /* __ASSUME_RECVMMSG_SOCKETCALL */
|
||||||
#else
|
#else
|
||||||
# define STUB 1
|
# include <socket/recvmmsg.c>
|
||||||
__set_errno (ENOSYS);
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef STUB
|
|
||||||
stub_warning (recvmmsg)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if __WORDSIZE == 64
|
|
||||||
versioned_symbol (libc, __recvmmsg, recvmmsg, GLIBC_2_24);
|
|
||||||
#else
|
|
||||||
weak_alias (__recvmmsg, recvmmsg)
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (C) 2015-2016 Free Software Foundation, Inc.
|
/* Linux recvmsg syscall wrapper.
|
||||||
|
Copyright (C) 2016 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -23,35 +24,11 @@
|
|||||||
ssize_t
|
ssize_t
|
||||||
__libc_recvmsg (int fd, struct msghdr *msg, int flags)
|
__libc_recvmsg (int fd, struct msghdr *msg, int flags)
|
||||||
{
|
{
|
||||||
ssize_t ret;
|
# ifdef __ASSUME_RECVMSG_SYSCALL
|
||||||
|
return SYSCALL_CANCEL (recvmsg, fd, msg, flags);
|
||||||
/* POSIX specifies that both msghdr::msg_iovlen and msghdr::msg_controllen
|
# else
|
||||||
to be int and socklen_t respectively. However Linux defines it as
|
return SOCKETCALL_CANCEL (recvmsg, fd, msg, flags);
|
||||||
both size_t. So for 64-bit it requires some adjustments by copying to
|
# endif
|
||||||
temporary header and zeroing the pad fields. */
|
|
||||||
#if __WORDSIZE == 64
|
|
||||||
struct msghdr hdr, *orig = msg;
|
|
||||||
if (msg != NULL)
|
|
||||||
{
|
|
||||||
hdr = *msg;
|
|
||||||
hdr.__glibc_reserved1 = 0;
|
|
||||||
hdr.__glibc_reserved2 = 0;
|
|
||||||
msg = &hdr;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __ASSUME_RECVMSG_SYSCALL
|
|
||||||
ret = SYSCALL_CANCEL (recvmsg, fd, msg, flags);
|
|
||||||
#else
|
|
||||||
ret = SOCKETCALL_CANCEL (recvmsg, fd, msg, flags);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if __WORDSIZE == 64
|
|
||||||
if (orig != NULL)
|
|
||||||
*orig = hdr;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
weak_alias (__libc_recvmsg, recvmsg)
|
||||||
weak_alias (__libc_recvmsg, __recvmsg)
|
weak_alias (__libc_recvmsg, __recvmsg)
|
||||||
versioned_symbol (libc, __libc_recvmsg, recvmsg, GLIBC_2_24);
|
|
||||||
|
@ -49,9 +49,6 @@ libc {
|
|||||||
GLIBC_2.11 {
|
GLIBC_2.11 {
|
||||||
fallocate64;
|
fallocate64;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
libutil {
|
libutil {
|
||||||
|
@ -1972,8 +1972,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -4,9 +4,6 @@ libc {
|
|||||||
__register_frame; __register_frame_table; __deregister_frame;
|
__register_frame; __register_frame_table; __deregister_frame;
|
||||||
__frame_state_for; __register_frame_info_table;
|
__frame_state_for; __register_frame_info_table;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
librt {
|
librt {
|
||||||
|
@ -1873,10 +1873,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmmsg F
|
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -16,10 +16,12 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <socketcall.h>
|
|
||||||
#include <sysdep-cancel.h>
|
#include <sysdep-cancel.h>
|
||||||
#include <shlib-compat.h>
|
#include <sys/syscall.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
|
|
||||||
/* Do not use the sendmmsg syscall on socketcall architectures unless
|
/* Do not use the sendmmsg syscall on socketcall architectures unless
|
||||||
it was added at the same time as the socketcall support or can be
|
it was added at the same time as the socketcall support or can be
|
||||||
@ -30,53 +32,31 @@
|
|||||||
# undef __NR_sendmmsg
|
# undef __NR_sendmmsg
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __WORDSIZE == 64
|
#ifdef __NR_sendmmsg
|
||||||
static inline int
|
int
|
||||||
send_mmsghdr (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
|
__sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
|
||||||
{
|
{
|
||||||
/* Emulate kernel interface for vlen size. */
|
return SYSCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
|
||||||
if (vlen > IOV_MAX)
|
|
||||||
vlen = IOV_MAX;
|
|
||||||
if (vlen == 0)
|
|
||||||
return 0;
|
|
||||||
/* POSIX specifies that both msghdr::msg_iovlen and msghdr::msg_controllen
|
|
||||||
to be int and socklen_t respectively, however Linux defines it as both
|
|
||||||
size_t. So for 64-bit it requires some adjustments by copying to
|
|
||||||
temporary header and zeroing the pad fields.
|
|
||||||
The problem is sendmmsg's msghdr may points to an already-filled control
|
|
||||||
buffer and modifying it is not part of sendmmsg contract (the data may
|
|
||||||
be in ro map). So interact over the msghdr calling the sendmsg that
|
|
||||||
adjust the header using a temporary buffer. */
|
|
||||||
for (unsigned int i = 0; i < vlen; i++)
|
|
||||||
{
|
|
||||||
ssize_t ret = __sendmsg (fd, &vmessages[i].msg_hdr, flags);
|
|
||||||
if (ret < 0)
|
|
||||||
return -1;
|
|
||||||
vmessages[i].msg_len = ret;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
#endif
|
libc_hidden_def (__sendmmsg)
|
||||||
|
weak_alias (__sendmmsg, sendmmsg)
|
||||||
|
#elif defined __NR_socketcall
|
||||||
|
# include <socketcall.h>
|
||||||
|
# ifdef __ASSUME_SENDMMSG_SOCKETCALL
|
||||||
|
int
|
||||||
|
__sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
|
||||||
|
{
|
||||||
|
return SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
|
||||||
|
}
|
||||||
|
# else
|
||||||
|
static int have_sendmmsg;
|
||||||
|
|
||||||
int
|
int
|
||||||
__sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
|
__sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
|
||||||
{
|
{
|
||||||
#if __WORDSIZE == 64
|
|
||||||
return send_mmsghdr (fd, vmessages, vlen, flags);
|
|
||||||
#elif defined __NR_sendmmsg
|
|
||||||
return SYSCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
|
|
||||||
#elif defined __NR_socketcall
|
|
||||||
# ifdef __ASSUME_SENDMMSG_SOCKETCALL
|
|
||||||
return SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
|
|
||||||
# else
|
|
||||||
static int have_sendmmsg;
|
|
||||||
if (__glibc_likely (have_sendmmsg >= 0))
|
if (__glibc_likely (have_sendmmsg >= 0))
|
||||||
{
|
{
|
||||||
# if __WORDSIZE == 64
|
|
||||||
int ret = send_mmsghdr (fd, vmessages, vlen, flags);
|
|
||||||
# else
|
|
||||||
int ret = SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
|
int ret = SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
|
||||||
# endif
|
|
||||||
/* The kernel returns -EINVAL for unknown socket operations.
|
/* The kernel returns -EINVAL for unknown socket operations.
|
||||||
We need to convert that error to an ENOSYS error. */
|
We need to convert that error to an ENOSYS error. */
|
||||||
if (__builtin_expect (ret < 0, 0)
|
if (__builtin_expect (ret < 0, 0)
|
||||||
@ -104,20 +84,10 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
|
|||||||
}
|
}
|
||||||
__set_errno (ENOSYS);
|
__set_errno (ENOSYS);
|
||||||
return -1;
|
return -1;
|
||||||
# endif /* __ASSUME_SENDMMSG_SOCKETCALL */
|
|
||||||
#else /* defined __NR_socketcall */
|
|
||||||
# define STUB 1
|
|
||||||
__set_errno (ENOSYS);
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#ifdef STUB
|
# endif /* __ASSUME_SENDMMSG_SOCKETCALL */
|
||||||
stub_warning (sendmmsg)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
libc_hidden_def (__sendmmsg)
|
libc_hidden_def (__sendmmsg)
|
||||||
#if __WORDSIZE == 64
|
|
||||||
versioned_symbol (libc, __sendmmsg, sendmmsg, GLIBC_2_24);
|
|
||||||
#else
|
|
||||||
weak_alias (__sendmmsg, sendmmsg)
|
weak_alias (__sendmmsg, sendmmsg)
|
||||||
|
#else
|
||||||
|
# include <socket/sendmmsg.c>
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (C) 2015-2016 Free Software Foundation, Inc.
|
/* Compatibility implementation of sendmsg.
|
||||||
|
Copyright (C) 2016 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -23,26 +24,11 @@
|
|||||||
ssize_t
|
ssize_t
|
||||||
__libc_sendmsg (int fd, const struct msghdr *msg, int flags)
|
__libc_sendmsg (int fd, const struct msghdr *msg, int flags)
|
||||||
{
|
{
|
||||||
/* POSIX specifies that both msghdr::msg_iovlen and msghdr::msg_controllen
|
# ifdef __ASSUME_SENDMSG_SYSCALL
|
||||||
to be int and socklen_t respectively. However Linux defines it as
|
|
||||||
both size_t. So for 64-bit it requires some adjustments by copying to
|
|
||||||
temporary header and zeroing the pad fields. */
|
|
||||||
#if __WORDSIZE == 64
|
|
||||||
struct msghdr hdr;
|
|
||||||
if (msg != NULL)
|
|
||||||
{
|
|
||||||
hdr = *msg;
|
|
||||||
hdr.__glibc_reserved1 = 0;
|
|
||||||
hdr.__glibc_reserved2 = 0;
|
|
||||||
msg = &hdr;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __ASSUME_SENDMSG_SYSCALL
|
|
||||||
return SYSCALL_CANCEL (sendmsg, fd, msg, flags);
|
return SYSCALL_CANCEL (sendmsg, fd, msg, flags);
|
||||||
#else
|
# else
|
||||||
return SOCKETCALL_CANCEL (sendmsg, fd, msg, flags);
|
return SOCKETCALL_CANCEL (sendmsg, fd, msg, flags);
|
||||||
#endif
|
# endif
|
||||||
}
|
}
|
||||||
|
weak_alias (__libc_sendmsg, sendmsg)
|
||||||
weak_alias (__libc_sendmsg, __sendmsg)
|
weak_alias (__libc_sendmsg, __sendmsg)
|
||||||
versioned_symbol (libc, __libc_sendmsg, sendmsg, GLIBC_2_24);
|
|
||||||
|
@ -30,7 +30,4 @@ libc {
|
|||||||
GLIBC_2.16 {
|
GLIBC_2.16 {
|
||||||
fanotify_mark;
|
fanotify_mark;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1858,8 +1858,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -29,9 +29,6 @@ libc {
|
|||||||
|
|
||||||
__getshmlba;
|
__getshmlba;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
libpthread {
|
libpthread {
|
||||||
|
@ -1964,8 +1964,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -8,9 +8,6 @@ libc {
|
|||||||
# w*
|
# w*
|
||||||
wordexp;
|
wordexp;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
librt {
|
librt {
|
||||||
|
@ -1902,10 +1902,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmmsg F
|
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -11,9 +11,6 @@ libc {
|
|||||||
fallocate64;
|
fallocate64;
|
||||||
set_dataplane;
|
set_dataplane;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
GLIBC_PRIVATE {
|
GLIBC_PRIVATE {
|
||||||
__syscall_error;
|
__syscall_error;
|
||||||
__vdso_clock_gettime;
|
__vdso_clock_gettime;
|
||||||
|
@ -2096,5 +2096,3 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
libc {
|
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
|
@ -2096,7 +2096,3 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmmsg F
|
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
|
@ -2096,5 +2096,3 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
libc {
|
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1853,10 +1853,6 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmmsg F
|
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
GLIBC_2.3 GLIBC_2.3 A
|
GLIBC_2.3 GLIBC_2.3 A
|
||||||
GLIBC_2.3 __ctype_b_loc F
|
GLIBC_2.3 __ctype_b_loc F
|
||||||
GLIBC_2.3 __ctype_tolower_loc F
|
GLIBC_2.3 __ctype_tolower_loc F
|
||||||
|
@ -6,9 +6,6 @@ libc {
|
|||||||
|
|
||||||
modify_ldt;
|
modify_ldt;
|
||||||
}
|
}
|
||||||
GLIBC_2.24 {
|
|
||||||
recvmsg; sendmsg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
librt {
|
librt {
|
||||||
|
@ -2096,5 +2096,3 @@ GLIBC_2.23 fts64_read F
|
|||||||
GLIBC_2.23 fts64_set F
|
GLIBC_2.23 fts64_set F
|
||||||
GLIBC_2.24 GLIBC_2.24 A
|
GLIBC_2.24 GLIBC_2.24 A
|
||||||
GLIBC_2.24 quick_exit F
|
GLIBC_2.24 quick_exit F
|
||||||
GLIBC_2.24 recvmsg F
|
|
||||||
GLIBC_2.24 sendmsg F
|
|
||||||
|
Reference in New Issue
Block a user