]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix __ASSUME_SENDMMSG issues (bug 16611).
authorJoseph Myers <joseph@codesourcery.com>
Thu, 20 Feb 2014 17:55:35 +0000 (17:55 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 20 Feb 2014 17:55:35 +0000 (17:55 +0000)
Similar to the issues for accept4 and recvmmsg, __ASSUME_SENDMMSG is
also confused about whether it relates to function availability or
socketcall operation availability, and the conditions for the
definition are always wrong (sendmmsg appeared in Linux kernel 3.0,
not 2.6.39); this is now bug 16611.

This patch splits the macro into separate macros like those for
accept4 and recvmmsg, defining them for appropriate kernel versions.

Tested x86_64, including that disassembly of the installed shared
libraries is unchanged by this patch.

[BZ #16611]
* sysdeps/unix/sysv/linux/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x030000 && __ASSUME_SOCKETCALL]
(__ASSUME_SENDMMSG_SOCKETCALL): Define.
[__LINUX_KERNEL_VERSION >= 0x030000 && (__i386__ || __x86_64__ ||
__powerpc__ || __sh__ || __sparc__)] (__ASSUME_SENDMMSG_SYSCALL):
Likewise.
[__i386__ || __powerpc__ || __sh__ || __sparc__]
(__ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL): Likewise.
[__ASSUME_SENDMMSG_SOCKETCALL || __ASSUME_SENDMMSG_SYSCALL]
(__ASSUME_SENDMMSG): Define instead of using previous
[__LINUX_KERNEL_VERSION >= 0x020627] condition.
* sysdeps/unix/sysv/linux/aarch64/kernel-features.h
(__ASSUME_SENDMMSG_SYSCALL): Define.
* sysdeps/unix/sysv/linux/alpha/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x030200] (__ASSUME_SENDMMSG_SYSCALL):
Likewise.
* sysdeps/unix/sysv/linux/arm/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x030000] (__ASSUME_SENDMMSG_SYSCALL):
Likewise.
* sysdeps/unix/sysv/linux/ia64/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x030000] (__ASSUME_SENDMMSG_SYSCALL):
Likewise.
* sysdeps/unix/sysv/linux/internal_sendmmsg.S [__ASSUME_SOCKETCALL
&& !__ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL &&
!__ASSUME_SENDMMSG_SYSCALL] (__NR_sendmmsg): Undefine.
[__ASSUME_SENDMMSG]: Change conditionals to
[__ASSUME_SENDMMSG_SOCKETCALL].
* sysdeps/unix/sysv/linux/microblaze/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x030300] (__ASSUME_SENDMMSG_SYSCALL):
Define.
* sysdeps/unix/sysv/linux/mips/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x030100] (__ASSUME_SENDMMSG_SYSCALL):
Likewise.
* sysdeps/unix/sysv/linux/sendmmsg.c [__ASSUME_SOCKETCALL &&
!__ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL &&
!__ASSUME_SENDMMSG_SYSCALL] (__NR_sendmmsg): Undefine.
[!__ASSUME_SENDMMSG]: Change conditional to
[!__ASSUME_SENDMMSG_SOCKETCALL].
* sysdeps/unix/sysv/linux/tile/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x030000] (__ASSUME_SENDMMSG_SYSCALL):
Define.

* sysdeps/unix/sysv/linux/hppa/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x030100] (__ASSUME_SENDMMSG_SYSCALL):
Define.

14 files changed:
ChangeLog
NEWS
ports/ChangeLog.hppa
ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
sysdeps/unix/sysv/linux/aarch64/kernel-features.h
sysdeps/unix/sysv/linux/alpha/kernel-features.h
sysdeps/unix/sysv/linux/arm/kernel-features.h
sysdeps/unix/sysv/linux/ia64/kernel-features.h
sysdeps/unix/sysv/linux/internal_sendmmsg.S
sysdeps/unix/sysv/linux/kernel-features.h
sysdeps/unix/sysv/linux/microblaze/kernel-features.h
sysdeps/unix/sysv/linux/mips/kernel-features.h
sysdeps/unix/sysv/linux/sendmmsg.c
sysdeps/unix/sysv/linux/tile/kernel-features.h

index 73f614b64af60c4cf49673e42965b061a0b11473..4ad0fe65944b5f574437be4531b1e8d040b1aabc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,48 @@
 2014-02-20  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #16611]
+       * sysdeps/unix/sysv/linux/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x030000 && __ASSUME_SOCKETCALL]
+       (__ASSUME_SENDMMSG_SOCKETCALL): Define.
+       [__LINUX_KERNEL_VERSION >= 0x030000 && (__i386__ || __x86_64__ ||
+       __powerpc__ || __sh__ || __sparc__)] (__ASSUME_SENDMMSG_SYSCALL):
+       Likewise.
+       [__i386__ || __powerpc__ || __sh__ || __sparc__]
+       (__ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL): Likewise.
+       [__ASSUME_SENDMMSG_SOCKETCALL || __ASSUME_SENDMMSG_SYSCALL]
+       (__ASSUME_SENDMMSG): Define instead of using previous
+       [__LINUX_KERNEL_VERSION >= 0x020627] condition.
+       * sysdeps/unix/sysv/linux/aarch64/kernel-features.h
+       (__ASSUME_SENDMMSG_SYSCALL): Define.
+       * sysdeps/unix/sysv/linux/alpha/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x030200] (__ASSUME_SENDMMSG_SYSCALL):
+       Likewise.
+       * sysdeps/unix/sysv/linux/arm/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x030000] (__ASSUME_SENDMMSG_SYSCALL):
+       Likewise.
+       * sysdeps/unix/sysv/linux/ia64/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x030000] (__ASSUME_SENDMMSG_SYSCALL):
+       Likewise.
+       * sysdeps/unix/sysv/linux/internal_sendmmsg.S [__ASSUME_SOCKETCALL
+       && !__ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL &&
+       !__ASSUME_SENDMMSG_SYSCALL] (__NR_sendmmsg): Undefine.
+       [__ASSUME_SENDMMSG]: Change conditionals to
+       [__ASSUME_SENDMMSG_SOCKETCALL].
+       * sysdeps/unix/sysv/linux/microblaze/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x030300] (__ASSUME_SENDMMSG_SYSCALL):
+       Define.
+       * sysdeps/unix/sysv/linux/mips/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x030100] (__ASSUME_SENDMMSG_SYSCALL):
+       Likewise.
+       * sysdeps/unix/sysv/linux/sendmmsg.c [__ASSUME_SOCKETCALL &&
+       !__ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL &&
+       !__ASSUME_SENDMMSG_SYSCALL] (__NR_sendmmsg): Undefine.
+       [!__ASSUME_SENDMMSG]: Change conditional to
+       [!__ASSUME_SENDMMSG_SOCKETCALL].
+       * sysdeps/unix/sysv/linux/tile/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x030000] (__ASSUME_SENDMMSG_SYSCALL):
+       Define.
+
        [BZ #16610]
        * sysdeps/unix/sysv/linux/kernel-features.h
        [__LINUX_KERNEL_VERSION >= 0x020621 && __ASSUME_SOCKETCALL]
diff --git a/NEWS b/NEWS
index 35da791fd646ecc15dc1698b264b6d0df683ee47..5a7aa73a935bf036f2334838b145c8fd044cd5b2 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -9,7 +9,7 @@ Version 2.20
 
 * The following bugs are resolved with this release:
 
-  15894, 16447, 16545, 16574, 16609, 16610.
+  15894, 16447, 16545, 16574, 16609, 16610, 16611.
 
 * The am33 port, which had not worked for several years, has been removed
   from ports.
index 5829e55c7188f5b5805b9372aed9506093305c66..c8eb0728b99e5084c2cfb347572ebe533f3e13a0 100644 (file)
@@ -1,5 +1,10 @@
 2014-02-20  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #16611]
+       * sysdeps/unix/sysv/linux/hppa/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x030100] (__ASSUME_SENDMMSG_SYSCALL):
+       Define.
+
        [BZ #16610]
        * sysdeps/unix/sysv/linux/hppa/kernel-features.h
        [__LINUX_KERNEL_VERSION >= 0x020622] (__ASSUME_RECVMMSG_SYSCALL):
index 75e1999d81032668bc2792e3f201a8270ff675c4..e869c14bddfb2c50905c27631ef9c23af0030cba 100644 (file)
@@ -36,4 +36,9 @@
 # define __ASSUME_RECVMMSG_SYSCALL     1
 #endif
 
+/* Support for the sendmmsg syscall was added in 3.1.  */
+#if __LINUX_KERNEL_VERSION >= 0x030100
+# define __ASSUME_SENDMMSG_SYSCALL     1
+#endif
+
 #include_next <kernel-features.h>
index 3f9cd049e91981f68d8c069d53d4013733d71eec..417f89b2d9b80059dc71f6c058a4da8bf5dd2ed5 100644 (file)
@@ -31,6 +31,7 @@
 #define __ASSUME_O_CLOEXEC              1
 #define __ASSUME_PIPE2                  1
 #define __ASSUME_RECVMMSG_SYSCALL       1
+#define __ASSUME_SENDMMSG_SYSCALL       1
 #define __ASSUME_SIGNALFD4             1
 #define __ASSUME_SOCK_CLOEXEC           1
 #define __ASSUME_UTIMES                 1
index 6e4a515749e01a52a0725fb102eabb6cf2128852..e691bb0e1ef29e5defff749ee010d470167d0cf8 100644 (file)
 # define __ASSUME_RECVMMSG_SYSCALL       1
 #endif
 
-/* Support for accept4 was added for alpha in 3.2.  */
+/* Support for accept4 and sendmmsg was added for alpha in 3.2.  */
 #if __LINUX_KERNEL_VERSION >= 0x030200
 # define __ASSUME_ACCEPT4_SYSCALL      1
+# define __ASSUME_SENDMMSG_SYSCALL     1
 #endif
 
 #include_next <kernel-features.h>
index 7b43e365e6889e1ca57ea95e060760ecea39300c..401343be8dfac0a60688643698a1db3c3a52cb1d 100644 (file)
 # define __ASSUME_ACCEPT4_SYSCALL      1
 #endif
 
+/* Support for the sendmmsg syscall was added in 3.0.  */
+#if __LINUX_KERNEL_VERSION >= 0x030000
+# define __ASSUME_SENDMMSG_SYSCALL     1
+#endif
+
 #include_next <kernel-features.h>
 
 /* Support for pselect6, ppoll and epoll_pwait was added in 2.6.32.  */
index b4955d9b1d260f031e4c8eae91ac77f8a90ba6ac..dd4de39fc71b859a9491fe05980e50c769ffa349 100644 (file)
 # define __ASSUME_RECVMMSG_SYSCALL     1
 #endif
 
+/* Support for the sendmmsg syscall was added in 3.0.  */
+#if __LINUX_KERNEL_VERSION >= 0x030000
+# define __ASSUME_SENDMMSG_SYSCALL     1
+#endif
+
 /* Support for the accept4 syscall was added in 3.3.  */
 #if __LINUX_KERNEL_VERSION >= 0x030300
 # define __ASSUME_ACCEPT4_SYSCALL      1
index e6681f099d7137121c90b82ebb2625863996f379..4d903ea729b7c2f886846618b8404d7c3dc66029 100644 (file)
@@ -1,15 +1,25 @@
 #include <kernel-features.h>
 #include <sys/syscall.h>
+
+/* 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 !defined __NR_sendmmsg && defined __NR_socketcall
 # define socket        sendmmsg
-# ifndef __ASSUME_SENDMMSG
+# ifndef __ASSUME_SENDMMSG_SOCKETCALL
 #  define __socket __internal_sendmmsg
 #  define NO_WEAK_ALIAS
 # endif
 # define NARGS 4
 # define NEED_CANCELLATION
 # include <socket.S>
-# ifdef __ASSUME_SENDMMSG
+# ifdef __ASSUME_SENDMMSG_SOCKETCALL
 libc_hidden_def (__sendmmsg)
 # endif
 #endif
index 034257edfa3a0b108096f804926d886b7783380b..555b82cf05e85ab60c6fa78d71962eb33e4ed047 100644 (file)
 # define __ASSUME_PRLIMIT64    1
 #endif
 
-/* sendmmsg is available in 2.6.39.  */
-#if __LINUX_KERNEL_VERSION >= 0x020627
+/* Support for sendmmsg functionality was added in 3.0.  The macros
+   defined correspond to those for accept4 and recvmmsg.  */
+#if __LINUX_KERNEL_VERSION >= 0x030000 && defined __ASSUME_SOCKETCALL
+# define __ASSUME_SENDMMSG_SOCKETCALL  1
+#endif
+
+/* The sendmmsg syscall was added for i386, x86_64, PowerPC, SH and
+   SPARC in 3.0.  */
+#if __LINUX_KERNEL_VERSION >= 0x030000                                 \
+    && (defined __i386__ || defined __x86_64__ || defined __powerpc__  \
+       || defined __sh__ || defined __sparc__)
+# define __ASSUME_SENDMMSG_SYSCALL     1
+#endif
+#if defined __i386__ || defined __powerpc__ || defined __sh__ \
+    || defined __sparc__
+# define __ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL     1
+#endif
+
+#if defined __ASSUME_SENDMMSG_SOCKETCALL || defined __ASSUME_SENDMMSG_SYSCALL
 # define __ASSUME_SENDMMSG     1
 #endif
 
index 7266e96495c46b749efa5f9bb4ff19322c4db2b9..1e9aba5f427e1eca3f789f13a8b75667e006a451 100644 (file)
@@ -36,4 +36,9 @@
 #endif
 #define __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL      1
 
+/* Support for the sendmmsg syscall was added in 3.3.  */
+#if __LINUX_KERNEL_VERSION >= 0x030300
+# define __ASSUME_SENDMMSG_SYSCALL       1
+#endif
+
 #include_next <kernel-features.h>
index 22064d9bd394861c74047a2320e0f7f2eee8cdf1..52cbf3a5bab30852c6e7c0b9afaa4c39365d9547 100644 (file)
 # define __ASSUME_RECVMMSG_SYSCALL     1
 #endif
 
+/* Support for the sendmmsg syscall was added in 3.1.  */
+#if __LINUX_KERNEL_VERSION >= 0x030100
+# define __ASSUME_SENDMMSG_SYSCALL     1
+#endif
+
 #include_next <kernel-features.h>
 
 /* The n32 syscall ABI did not have a getdents64 syscall until
index f8494be044d56e725fd64ed5e67f1e8821eb86bb..30740664d079e96cb988c83c1d436a9b44a50aad 100644 (file)
 #include <sys/syscall.h>
 #include <kernel-features.h>
 
+/* 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
 
 #ifdef __NR_sendmmsg
 int
@@ -42,7 +50,7 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
 libc_hidden_def (__sendmmsg)
 weak_alias (__sendmmsg, sendmmsg)
 #elif defined __NR_socketcall
-# ifndef __ASSUME_SENDMMSG
+# ifndef __ASSUME_SENDMMSG_SOCKETCALL
 extern int __internal_sendmmsg (int fd, struct mmsghdr *vmessages,
                                unsigned int vlen, int flags)
      attribute_hidden;
@@ -86,7 +94,8 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
 libc_hidden_def (__sendmmsg)
 weak_alias (__sendmmsg, sendmmsg)
 # else
-/* When __ASSUME_SENDMMSG sendmmsg is defined in internal_sendmmsg.S.  */
+/* When __ASSUME_SENDMMSG_SOCKETCALL sendmmsg is defined in
+   internal_sendmmsg.S.  */
 # endif
 #else
 # include <socket/sendmmsg.c>
index b415d8f10fd0431a0d33b18af1409524c66f358f..bf7bddc47f0d31ea4e89385c02f19dc724d970e8 100644 (file)
 #define __ASSUME_DUP3                  1
 #define __ASSUME_RECVMMSG_SYSCALL      1
 
+/* Support for the sendmmsg syscall was added in 3.0.  */
+#if __LINUX_KERNEL_VERSION >= 0x030000
+# define __ASSUME_SENDMMSG_SYSCALL     1
+#endif
+
 #include_next <kernel-features.h>
 
 /* Define this if your 32-bit syscall API requires 64-bit register