From 34a28994be161a624d591fe5a8086d27a85f8a8a Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Sun, 12 Jun 2016 21:07:38 +0200 Subject: [PATCH] Related: #1344830 First phase of sendmsg/recvmsg/sendmmsg/recvmmsg ABI revert: GLIBC_2.24 compatibility symbols. This should allow us to run old binaries (with the GLIBC_2.24 symbols) while rebuild packages to use the old ABI again. --- glibc-rh1344830.patch | 920 ++++++++++++++++++++++++++++++++++++++++++ glibc.spec | 4 + 2 files changed, 924 insertions(+) create mode 100644 glibc-rh1344830.patch diff --git a/glibc-rh1344830.patch b/glibc-rh1344830.patch new file mode 100644 index 0000000..a0dcee2 --- /dev/null +++ b/glibc-rh1344830.patch @@ -0,0 +1,920 @@ +commit 8e03c512202576ddabbf352fd1413f8bff749e76 +Author: Florian Weimer +Date: Sun Jun 12 20:58:50 2016 +0200 + + recvmsg, sendmsg, recvmmsg, sendmmsg: 2.24 ABI revert compatibility + + GLIBC_2.24 compatibility versions are added to be able to run old + binaries, so that use of the GLIBC_2.24 symbol versions can be phased + out gradually. + + It uses an endian-agnostic, word-size approach to sanitize the upper + bits of the affected struct members, using the old struct definitions + without padding. + +Index: b/sysdeps/unix/sysv/linux/Makefile +=================================================================== +--- a/sysdeps/unix/sysv/linux/Makefile ++++ b/sysdeps/unix/sysv/linux/Makefile +@@ -124,9 +124,10 @@ 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 +-sysdep_routines += cmsg_nxthdr ++sysdep_routines += cmsg_nxthdr msgcompat + CFLAGS-recvmmsg.c = -fexceptions -fasynchronous-unwind-tables + CFLAGS-sendmmsg.c = -fexceptions -fasynchronous-unwind-tables ++CFLAGS-msgcompat.c = -fexceptions -fasynchronous-unwind-tables + endif + + ifeq ($(subdir),sunrpc) +Index: b/sysdeps/unix/sysv/linux/aarch64/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/aarch64/Versions ++++ b/sysdeps/unix/sysv/linux/aarch64/Versions +@@ -5,6 +5,10 @@ ld { + } + } + libc { ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } ++ + GLIBC_PRIVATE { + __vdso_clock_gettime; + __vdso_clock_getres; +Index: b/sysdeps/unix/sysv/linux/aarch64/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist ++++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist +@@ -2089,3 +2089,7 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 +Index: b/sysdeps/unix/sysv/linux/alpha/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/alpha/Versions ++++ b/sysdeps/unix/sysv/linux/alpha/Versions +@@ -85,6 +85,9 @@ libc { + #errlist-compat 140 + _sys_errlist; sys_errlist; _sys_nerr; sys_nerr; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + GLIBC_PRIVATE { + __libc_alpha_cache_shape; + } +Index: b/sysdeps/unix/sysv/linux/alpha/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist ++++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist +@@ -2000,6 +2000,10 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/arm/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/arm/libc.abilist ++++ b/sysdeps/unix/sysv/linux/arm/libc.abilist +@@ -90,6 +90,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 _Exit F + GLIBC_2.4 _IO_2_1_stderr_ D 0xa0 +Index: b/sysdeps/unix/sysv/linux/hppa/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/hppa/Versions ++++ b/sysdeps/unix/sysv/linux/hppa/Versions +@@ -35,4 +35,7 @@ libc { + GLIBC_2.19 { + fanotify_mark; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } +Index: b/sysdeps/unix/sysv/linux/hppa/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist ++++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist +@@ -1854,6 +1854,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/i386/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/i386/Versions ++++ b/sysdeps/unix/sysv/linux/i386/Versions +@@ -45,6 +45,9 @@ libc { + # f* + fallocate64; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + GLIBC_PRIVATE { + __modify_ldt; + __uname; +Index: b/sysdeps/unix/sysv/linux/i386/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/i386/libc.abilist ++++ b/sysdeps/unix/sysv/linux/i386/libc.abilist +@@ -2012,6 +2012,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/ia64/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/ia64/libc.abilist ++++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist +@@ -1876,6 +1876,10 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/m68k/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/m68k/Versions ++++ b/sysdeps/unix/sysv/linux/m68k/Versions +@@ -40,6 +40,9 @@ libc { + GLIBC_2.12 { + __m68k_read_tp; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + GLIBC_PRIVATE { + __vdso_atomic_cmpxchg_32; __vdso_atomic_barrier; + } +Index: b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist ++++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist +@@ -91,6 +91,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 _Exit F + GLIBC_2.4 _IO_2_1_stderr_ D 0x98 +Index: b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist ++++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist +@@ -1968,6 +1968,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/microblaze/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/microblaze/Versions ++++ b/sysdeps/unix/sysv/linux/microblaze/Versions +@@ -2,4 +2,7 @@ libc { + GLIBC_2.18 { + fallocate64; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } +Index: b/sysdeps/unix/sysv/linux/microblaze/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist ++++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist +@@ -2089,3 +2089,5 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + GLIBC_2.24 quick_exit F ++GLIBC_2.24 recvmsg F ++GLIBC_2.24 sendmsg F +Index: b/sysdeps/unix/sysv/linux/mips/mips32/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/mips/mips32/Versions ++++ b/sysdeps/unix/sysv/linux/mips/mips32/Versions +@@ -3,4 +3,7 @@ libc { + getrlimit64; + setrlimit64; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } +Index: b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist ++++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist +@@ -1943,6 +1943,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist ++++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist +@@ -1941,6 +1941,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/mips/mips64/n32/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/Versions ++++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/Versions +@@ -3,4 +3,7 @@ libc { + getrlimit64; + setrlimit64; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } +Index: b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist ++++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist +@@ -1939,6 +1939,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/mips/mips64/n64/Versions +=================================================================== +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/Versions +@@ -0,0 +1,5 @@ ++libc { ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } ++} +Index: b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist ++++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist +@@ -1934,6 +1934,10 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/msgcompat.c +=================================================================== +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/msgcompat.c +@@ -0,0 +1,254 @@ ++/* Temporary compatibility to bridge 2.24 ABI revert. ++ Copyright (C) 2015-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 ++ . */ ++ ++#ifdef SHARED ++ ++#include ++#include ++#include ++#include ++ ++ssize_t ++__libc_recvmsg_224 (int fd, struct msghdr *msg, int flags) ++{ ++ ssize_t ret; ++ ++ /* 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. */ ++ struct msghdr hdr, *orig = msg; ++ if (msg != NULL) ++ { ++ hdr = *msg; ++ hdr.msg_iovlen = (int) hdr.msg_iovlen; ++ hdr.msg_controllen = (socklen_t) hdr.msg_controllen; ++ msg = &hdr; ++ } ++ ++# ifdef __ASSUME_RECVMSG_SYSCALL ++ ret = SYSCALL_CANCEL (recvmsg, fd, msg, flags); ++# else ++ ret = SOCKETCALL_CANCEL (recvmsg, fd, msg, flags); ++# endif ++ ++ if (orig != NULL) ++ *orig = hdr; ++ ++ return ret; ++} ++compat_symbol (libc, __libc_recvmsg_224, recvmsg, GLIBC_2_24); ++ ++ssize_t ++__sendmsg_224 (int fd, const struct msghdr *msg, int flags) ++{ ++ /* 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. */ ++ struct msghdr hdr; ++ if (msg != NULL) ++ { ++ hdr = *msg; ++ hdr.msg_iovlen = (int) hdr.msg_iovlen; ++ hdr.msg_controllen = (socklen_t) hdr.msg_controllen; ++ msg = &hdr; ++ } ++ ++# ifdef __ASSUME_SENDMSG_SYSCALL ++ return SYSCALL_CANCEL (sendmsg, fd, msg, flags); ++# else ++ return SOCKETCALL_CANCEL (sendmsg, fd, msg, flags); ++# endif ++} ++compat_symbol (libc, __sendmsg_224, sendmsg, GLIBC_2_24); ++ ++ ++ ++/* Do not use the sendmmsg 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_SENDMMSG_SYSCALL_WITH_SOCKETCALL \ ++ && !defined __ASSUME_SENDMMSG_SYSCALL ++# undef __NR_sendmmsg ++# endif ++ ++# if __WORDSIZE == 64 ++static inline int ++send_mmsghdr (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) ++{ ++ /* Emulate kernel interface for vlen size. */ ++ 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_224 (fd, &vmessages[i].msg_hdr, flags); ++ if (ret < 0) ++ return -1; ++ vmessages[i].msg_len = ret; ++ } ++ return 1; ++} ++# endif ++ ++int ++__sendmmsg_224 (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 __WORDSIZE == 64 ++ int ret = send_mmsghdr (fd, vmessages, vlen, flags); ++# else ++ int ret = SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags); ++# endif ++ /* 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, __sendmmsg_224, sendmmsg, 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 ++ ++static inline void ++adjust_mmsghdr (struct mmsghdr *vmessages, unsigned int vlen) ++{ ++# if __WORDSIZE == 64 ++ /* 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.msg_iovlen = (int) vmhdr->msg_hdr.msg_iovlen; ++ vmhdr->msg_hdr.msg_controllen ++ = (socklen_t) vmhdr->msg_hdr.msg_controllen; ++ } ++# endif ++} ++ ++int ++__recvmmsg_224 (int fd, struct mmsghdr *vmessages, unsigned int vlen, ++ int flags, 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)) ++ { ++ adjust_mmsghdr (vmessages, vlen); ++ 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, __recvmmsg_224, recvmmsg, GLIBC_2_24); ++ ++#endif /* SHARED */ +Index: b/sysdeps/unix/sysv/linux/nios2/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/nios2/Versions ++++ b/sysdeps/unix/sysv/linux/nios2/Versions +@@ -3,4 +3,7 @@ libc { + _flush_cache; + cacheflush; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } +Index: b/sysdeps/unix/sysv/linux/nios2/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist ++++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist +@@ -2130,3 +2130,5 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + GLIBC_2.24 quick_exit F ++GLIBC_2.24 recvmsg F ++GLIBC_2.24 sendmsg F +Index: b/sysdeps/unix/sysv/linux/powerpc/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/powerpc/Versions ++++ b/sysdeps/unix/sysv/linux/powerpc/Versions +@@ -5,6 +5,9 @@ ld { + } + } + libc { ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + GLIBC_PRIVATE { + __vdso_get_tbfreq; + __vdso_clock_gettime; +Index: b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist ++++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist +@@ -1972,6 +1972,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist ++++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist +@@ -1977,6 +1977,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions ++++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions +@@ -22,6 +22,9 @@ libc { + GLIBC_2.17 { + __ppc_get_timebase_freq; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } + + librt { +Index: b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist ++++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist +@@ -2177,3 +2177,7 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 +Index: b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist ++++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist +@@ -91,6 +91,10 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 _Exit F + GLIBC_2.3 _IO_2_1_stderr_ D 0xe0 +Index: b/sysdeps/unix/sysv/linux/s390/s390-32/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/s390/s390-32/Versions ++++ b/sysdeps/unix/sysv/linux/s390/s390-32/Versions +@@ -49,6 +49,9 @@ libc { + GLIBC_2.11 { + fallocate64; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } + + libutil { +Index: b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist ++++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist +@@ -1972,6 +1972,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/s390/s390-64/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/s390/s390-64/Versions ++++ b/sysdeps/unix/sysv/linux/s390/s390-64/Versions +@@ -4,6 +4,9 @@ libc { + __register_frame; __register_frame_table; __deregister_frame; + __frame_state_for; __register_frame_info_table; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } + + librt { +Index: b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist ++++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist +@@ -1873,6 +1873,10 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/sh/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/sh/Versions ++++ b/sysdeps/unix/sysv/linux/sh/Versions +@@ -30,4 +30,7 @@ libc { + GLIBC_2.16 { + fanotify_mark; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } +Index: b/sysdeps/unix/sysv/linux/sh/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/sh/libc.abilist ++++ b/sysdeps/unix/sysv/linux/sh/libc.abilist +@@ -1858,6 +1858,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/sparc/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/sparc/Versions ++++ b/sysdeps/unix/sysv/linux/sparc/Versions +@@ -29,6 +29,9 @@ libc { + + __getshmlba; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } + + libpthread { +Index: b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist ++++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist +@@ -1964,6 +1964,8 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/sparc/sparc64/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/sparc/sparc64/Versions ++++ b/sysdeps/unix/sysv/linux/sparc/sparc64/Versions +@@ -8,6 +8,9 @@ libc { + # w* + wordexp; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } + + librt { +Index: b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist ++++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist +@@ -1902,6 +1902,10 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/tile/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/tile/Versions ++++ b/sysdeps/unix/sysv/linux/tile/Versions +@@ -11,6 +11,9 @@ libc { + fallocate64; + set_dataplane; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + GLIBC_PRIVATE { + __syscall_error; + __vdso_clock_gettime; +Index: b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist ++++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist +@@ -2096,3 +2096,5 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + GLIBC_2.24 quick_exit F ++GLIBC_2.24 recvmsg F ++GLIBC_2.24 sendmsg F +Index: b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/Versions +=================================================================== +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/Versions +@@ -0,0 +1,5 @@ ++libc { ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } ++} +Index: b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist ++++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist +@@ -2096,3 +2096,7 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 +Index: b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist ++++ b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist +@@ -2096,3 +2096,5 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + GLIBC_2.24 quick_exit F ++GLIBC_2.24 recvmsg F ++GLIBC_2.24 sendmsg F +Index: b/sysdeps/unix/sysv/linux/x86_64/64/Versions +=================================================================== +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/x86_64/64/Versions +@@ -0,0 +1,5 @@ ++libc { ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } ++} +Index: b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist ++++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist +@@ -1853,6 +1853,10 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + 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 __ctype_b_loc F + GLIBC_2.3 __ctype_tolower_loc F +Index: b/sysdeps/unix/sysv/linux/x86_64/Versions +=================================================================== +--- a/sysdeps/unix/sysv/linux/x86_64/Versions ++++ b/sysdeps/unix/sysv/linux/x86_64/Versions +@@ -6,6 +6,9 @@ libc { + + modify_ldt; + } ++ GLIBC_2.24 { ++ recvmsg; sendmsg; ++ } + } + + librt { +Index: b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist +=================================================================== +--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist ++++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist +@@ -2096,3 +2096,5 @@ GLIBC_2.23 fts64_read F + GLIBC_2.23 fts64_set F + GLIBC_2.24 GLIBC_2.24 A + GLIBC_2.24 quick_exit F ++GLIBC_2.24 recvmsg F ++GLIBC_2.24 sendmsg F diff --git a/glibc.spec b/glibc.spec index 1356205..e65ccd7 100644 --- a/glibc.spec +++ b/glibc.spec @@ -297,6 +297,7 @@ Patch2036: glibc-gcc-PR69537.patch # extend_alloca removal, BZ 18023 Patch2037: glibc-rh1315108.patch Patch2038: glibc-rh1335011.patch +Patch2039: glibc-rh1344830.patch ############################################################################## # End of glibc patches. @@ -776,6 +777,7 @@ microbenchmark tests on the system. %patch2036 -p1 %patch2037 -p1 %patch2038 -p1 +%patch2039 -p1 ############################################################################## # %%prep - Additional prep required... @@ -2070,6 +2072,8 @@ rm -f *.filelist* %changelog * Sat Jun 11 2016 Florian Weimer - 2.23.90-21 +- First phase of sendmsg/recvmsg/sendmmsg/recvmmsg ABI revert: + GLIBC_2.24 compatibility symbols (#1344830) - Auto-sync with upstream master (commit 31d0a4fa646db8b8c97ce24e0ec0a7b73de4fca1), fixing the following bugs: