]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix __ASSUME_RECVMMSG issues (bug 16610).
authorJoseph Myers <joseph@codesourcery.com>
Thu, 20 Feb 2014 17:53:08 +0000 (17:53 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 20 Feb 2014 17:53:08 +0000 (17:53 +0000)
Similar to the issues for accept4, __ASSUME_RECVMMSG is also confused
about whether it relates to function availability or socketcall
operation availability; this is now bug 16610.

Nothing actually tests __ASSUME_RECVMMSG for function availability,
but implicit in the definition in kernel-features.h is the idea that
it makes sense when the syscall is available and socketcall is not
being used.  As with accept4, there are architectures where the
syscall was added later than the socketcall operation, meaning that
assuming glibc is built with recent enough kernel headers, it does not
attempt to use socketcall for these operations and __ASSUME_RECVMMSG
gets defined for kernels >= 2.6.33 even when the syscall was only
added later.

This patch splits the macro into separate macros like those used for
accept4; having similar macro structure in both cases (and for
sendmmsg once I've dealt with that) seems likely to be less confusing
than having a different structure on the basis of nothing actually
needing to assume the recvmmsg function works.  Appropriate
definitions are added for all architectures.

Architecture-specific note: Tile's kernel-features.h says "TILE glibc
support starts with 2.6.36", which is accurate in that 2.6.36 was the
first kernel version with Tile support, and on that basis I've made
that header define __ASSUME_RECVMMSG_SYSCALL unconditionally.
However, Tile's configure.ac has arch_minimum_kernel=2.6.32.  Since
arch_minimum_kernel is meant to reflect only kernel.org kernel
versions, I think that should change to 2.6.36.  (If using glibc with
kernel versions from before a port went in kernel.org, it's your
responsibility to change arch_minimum_kernel in a local patch, and at
the same time to adjust any __ASSUME_* definitions that may not be
correct for your older kernel; for developing the official glibc it
should only ever be necessary to consider what official kernel.org
releases support.)

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

[BZ #16610]
* sysdeps/unix/sysv/linux/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x020621 && __ASSUME_SOCKETCALL]
(__ASSUME_RECVMMSG_SOCKETCALL): Define.
[(__LINUX_KERNEL_VERSION >= 0x020621 && (__i386__ || __x86_64__ ||
__sparc__)) || (__LINUX_KERNEL_VERSION >= 0x020625 && (__powerpc__
|| __sh__))] (__ASSUME_RECVMMSG_SYSCALL): Likewise.
[__i386__ || __sparc__]
(__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL): Likewise.
[__ASSUME_RECVMMSG_SOCKETCALL || __ASSUME_RECVMMSG_SYSCALL]
(__ASSUME_RECVMMSG): Define instead of using previous
[__LINUX_KERNEL_VERSION >= 0x020621] condition.
* sysdeps/unix/sysv/linux/aarch64/kernel-features.h
(__ASSUME_RECVMMSG_SYSCALL): Define.
* sysdeps/unix/sysv/linux/alpha/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
Likewise.
* sysdeps/unix/sysv/linux/arm/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
Likewise.
* sysdeps/unix/sysv/linux/ia64/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
Likewise.
* sysdeps/unix/sysv/linux/internal_recvmmsg.S [__ASSUME_SOCKETCALL
&& !__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL &&
!__ASSUME_RECVMMSG_SYSCALL] (__NR_recvmmsg): Undefine.
[__ASSUME_RECVMMSG]: Change condition to
[__ASSUME_RECVMMSG_SOCKETCALL].
* sysdeps/unix/sysv/linux/microblaze/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
Define.
(__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL): Likewise.
* sysdeps/unix/sysv/linux/mips/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
Likewise.
* sysdeps/unix/sysv/linux/recvmmsg.c [__ASSUME_SOCKETCALL &&
!__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL &&
!__ASSUME_RECVMMSG_SYSCALL] (__NR_recvmmsg): Undefine.
[!__ASSUME_RECVMMSG]: Change condition to
[!__ASSUME_RECVMMSG_SOCKETCALL].
* sysdeps/unix/sysv/linux/tile/kernel-features.h
(__ASSUME_RECVMMSG_SYSCALL): Define.

* sysdeps/unix/sysv/linux/hppa/kernel-features.h
[__LINUX_KERNEL_VERSION >= 0x020622] (__ASSUME_RECVMMSG_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_recvmmsg.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/recvmmsg.c
sysdeps/unix/sysv/linux/tile/kernel-features.h

index a7b2fd938a8d311936fb2d2c942cb947a31a8c23..73f614b64af60c4cf49673e42965b061a0b11473 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,48 @@
 2014-02-20  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #16610]
+       * sysdeps/unix/sysv/linux/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x020621 && __ASSUME_SOCKETCALL]
+       (__ASSUME_RECVMMSG_SOCKETCALL): Define.
+       [(__LINUX_KERNEL_VERSION >= 0x020621 && (__i386__ || __x86_64__ ||
+       __sparc__)) || (__LINUX_KERNEL_VERSION >= 0x020625 && (__powerpc__
+       || __sh__))] (__ASSUME_RECVMMSG_SYSCALL): Likewise.
+       [__i386__ || __sparc__]
+       (__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL): Likewise.
+       [__ASSUME_RECVMMSG_SOCKETCALL || __ASSUME_RECVMMSG_SYSCALL]
+       (__ASSUME_RECVMMSG): Define instead of using previous
+       [__LINUX_KERNEL_VERSION >= 0x020621] condition.
+       * sysdeps/unix/sysv/linux/aarch64/kernel-features.h
+       (__ASSUME_RECVMMSG_SYSCALL): Define.
+       * sysdeps/unix/sysv/linux/alpha/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
+       Likewise.
+       * sysdeps/unix/sysv/linux/arm/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
+       Likewise.
+       * sysdeps/unix/sysv/linux/ia64/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
+       Likewise.
+       * sysdeps/unix/sysv/linux/internal_recvmmsg.S [__ASSUME_SOCKETCALL
+       && !__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL &&
+       !__ASSUME_RECVMMSG_SYSCALL] (__NR_recvmmsg): Undefine.
+       [__ASSUME_RECVMMSG]: Change condition to
+       [__ASSUME_RECVMMSG_SOCKETCALL].
+       * sysdeps/unix/sysv/linux/microblaze/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
+       Define.
+       (__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL): Likewise.
+       * sysdeps/unix/sysv/linux/mips/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
+       Likewise.
+       * sysdeps/unix/sysv/linux/recvmmsg.c [__ASSUME_SOCKETCALL &&
+       !__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL &&
+       !__ASSUME_RECVMMSG_SYSCALL] (__NR_recvmmsg): Undefine.
+       [!__ASSUME_RECVMMSG]: Change condition to
+       [!__ASSUME_RECVMMSG_SOCKETCALL].
+       * sysdeps/unix/sysv/linux/tile/kernel-features.h
+       (__ASSUME_RECVMMSG_SYSCALL): Define.
+
        [BZ #16609]
        * sysdeps/unix/sysv/linux/kernel-features.h [__i386__ ||
        __powerpc__ || __s390__ || __sh__ || __sparc__]
diff --git a/NEWS b/NEWS
index 381315580f15501f446e76fb75f2d0f4810341b2..35da791fd646ecc15dc1698b264b6d0df683ee47 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.
+  15894, 16447, 16545, 16574, 16609, 16610.
 
 * The am33 port, which had not worked for several years, has been removed
   from ports.
index bd415aa12d99622d8f2abce5c1a45b539df5b001..5829e55c7188f5b5805b9372aed9506093305c66 100644 (file)
@@ -1,5 +1,10 @@
 2014-02-20  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #16610]
+       * sysdeps/unix/sysv/linux/hppa/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x020622] (__ASSUME_RECVMMSG_SYSCALL):
+       Define.
+
        [BZ #16609]
        * sysdeps/unix/sysv/linux/hppa/kernel-features.h
        [__LINUX_KERNEL_VERSION >= 0x020622] (__ASSUME_ACCEPT4_SYSCALL):
index b8abd08138518f8cdfc84ba4dde92f127e8929c3..75e1999d81032668bc2792e3f201a8270ff675c4 100644 (file)
 /* PA-RISC 2.6.9 kernels had the first LWS CAS support */
 #define __ASSUME_LWS_CAS               1
 
-/* Support for the accept4 syscall was added in 2.6.34.  */
+/* Support for the accept4 and recvmmsg syscalls was added in 2.6.34.  */
 #if __LINUX_KERNEL_VERSION >= 0x020622
 # define __ASSUME_ACCEPT4_SYSCALL      1
+# define __ASSUME_RECVMMSG_SYSCALL     1
 #endif
 
 #include_next <kernel-features.h>
index 222b61c02c1150da13dc9ca2ec59dd25ce15ec98..3f9cd049e91981f68d8c069d53d4013733d71eec 100644 (file)
@@ -30,6 +30,7 @@
 #define __ASSUME_IN_NONBLOCK            1
 #define __ASSUME_O_CLOEXEC              1
 #define __ASSUME_PIPE2                  1
+#define __ASSUME_RECVMMSG_SYSCALL       1
 #define __ASSUME_SIGNALFD4             1
 #define __ASSUME_SOCK_CLOEXEC           1
 #define __ASSUME_UTIMES                 1
index 8cceb345920582917e3b41a5b7083dbcfd1a7a32..6e4a515749e01a52a0725fb102eabb6cf2128852 100644 (file)
 # define __ASSUME_SIGNALFD4 1
 #endif
 
+/* Support for recvmmsg was added for alpha in 2.6.33.  */
+#if __LINUX_KERNEL_VERSION >= 0x020621
+# define __ASSUME_RECVMMSG_SYSCALL       1
+#endif
+
 /* Support for accept4 was added for alpha in 3.2.  */
 #if __LINUX_KERNEL_VERSION >= 0x030200
 # define __ASSUME_ACCEPT4_SYSCALL      1
index 304f88d4a6519e02da6db9e8bc97580f2cda3d3e..7b43e365e6889e1ca57ea95e060760ecea39300c 100644 (file)
 # define __ASSUME_SIGNALFD4    1
 #endif
 
+/* Support for the recvmmsg syscall was added in 2.6.33.  */
+#if __LINUX_KERNEL_VERSION >= 0x020621
+# define __ASSUME_RECVMMSG_SYSCALL     1
+#endif
+
 /* Support for the accept4 syscall was added in 2.6.36.  */
 #if __LINUX_KERNEL_VERSION >= 0x020624
 # define __ASSUME_ACCEPT4_SYSCALL      1
index 5c7c4eb8a5e2f32e3257f1ebae68876501bbd7d5..b4955d9b1d260f031e4c8eae91ac77f8a90ba6ac 100644 (file)
 # define __ASSUME_DUP3         1
 #endif
 
+/* Support for the recvmmsg syscall was added in 2.6.33.  */
+#if __LINUX_KERNEL_VERSION >= 0x020621
+# define __ASSUME_RECVMMSG_SYSCALL     1
+#endif
+
 /* Support for the accept4 syscall was added in 3.3.  */
 #if __LINUX_KERNEL_VERSION >= 0x030300
 # define __ASSUME_ACCEPT4_SYSCALL      1
index 66c13579401fab5700f8334dc0a1041e926c5976..6b776b9d6a78d2f6a2bb1886f732d1ae43d8715f 100644 (file)
@@ -1,8 +1,18 @@
 #include <kernel-features.h>
 #include <sys/syscall.h>
+
+/* 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
+
 #if !defined __NR_recvmmsg && defined __NR_socketcall
 # define socket        recvmmsg
-# ifdef __ASSUME_RECVMMSG
+# ifdef __ASSUME_RECVMMSG_SOCKETCALL
 #  define __socket recvmmsg
 # else
 #  define __socket __internal_recvmmsg
index b6d7714073e404878351561c2c0f3bf2f003b105..034257edfa3a0b108096f804926d886b7783380b 100644 (file)
 # define __ASSUME_F_GETOWN_EX  1
 #endif
 
-/* Support for the recvmmsg syscall was added in 2.6.33.  */
-#if __LINUX_KERNEL_VERSION >= 0x020621
+/* Support for recvmmsg functionality was added in 2.6.33.  The macros
+   defined correspond to those for accept4.  */
+#if __LINUX_KERNEL_VERSION >= 0x020621 && defined __ASSUME_SOCKETCALL
+# define __ASSUME_RECVMMSG_SOCKETCALL  1
+#endif
+
+/* The recvmmsg syscall was added for i386, x86_64 and SPARC in
+   2.6.33, and for PowerPC and SH in 2.6.37.  */
+#if (__LINUX_KERNEL_VERSION >= 0x020621                        \
+     && (defined __i386__ || defined __x86_64__ || defined __sparc__)) \
+    || (__LINUX_KERNEL_VERSION >= 0x020625             \
+       && (defined __powerpc__ || defined __sh__))
+# define __ASSUME_RECVMMSG_SYSCALL     1
+#endif
+#if defined __i386__ || defined __sparc__
+# define __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL     1
+#endif
+
+#if defined __ASSUME_RECVMMSG_SOCKETCALL || defined __ASSUME_RECVMMSG_SYSCALL
 # define __ASSUME_RECVMMSG     1
 #endif
 
index 413b4a0b90bf196e9d70d90e99f907eb21e85a12..7266e96495c46b749efa5f9bb4ff19322c4db2b9 100644 (file)
 #define __ASSUME_SIGNALFD4      1
 #define __ASSUME_DUP3           1
 
-/* Support for the accept4 syscall was added in 2.6.33.  */
+/* Support for the accept4 and recvmmsg syscalls was added in 2.6.33.  */
 #if __LINUX_KERNEL_VERSION >= 0x020621
 # define __ASSUME_ACCEPT4_SYSCALL        1
+# define __ASSUME_RECVMMSG_SYSCALL       1
 #endif
+#define __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL      1
 
 #include_next <kernel-features.h>
index 94deaf9205203457ac1daa869a6785ce73ae49e0..22064d9bd394861c74047a2320e0f7f2eee8cdf1 100644 (file)
 # define __ASSUME_ACCEPT4_SYSCALL      1
 #endif
 
+/* Support for the recvmmsg syscall was added in 2.6.33.  */
+#if __LINUX_KERNEL_VERSION >= 0x020621
+# define __ASSUME_RECVMMSG_SYSCALL     1
+#endif
+
 #include_next <kernel-features.h>
 
 /* The n32 syscall ABI did not have a getdents64 syscall until
index 04ff42ee72716a8a7bff15c23b1503cdae6fd252..57ddf3152abfca7f3d9abb080688ac7ed1227f37 100644 (file)
 #include <sys/syscall.h>
 #include <kernel-features.h>
 
+/* 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
 
 #ifdef __NR_recvmmsg
 int
@@ -41,7 +49,7 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
   return result;
 }
 #elif defined __NR_socketcall
-# ifndef __ASSUME_RECVMMSG
+# ifndef __ASSUME_RECVMMSG_SOCKETCALL
 extern int __internal_recvmmsg (int fd, struct mmsghdr *vmessages,
                                unsigned int vlen, int flags,
                                const struct timespec *tmo)
@@ -85,7 +93,8 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
   return -1;
 }
 # else
-/* When __ASSUME_RECVMMSG recvmmsg is defined in internal_recvmmsg.S.  */
+/* When __ASSUME_RECVMMSG_SOCKETCALL recvmmsg is defined in
+   internal_recvmmsg.S.  */
 # endif
 #else
 # include <socket/recvmmsg.c>
index e339e7a5b23ac47dfa4df170ed87ef7787d3a717..b415d8f10fd0431a0d33b18af1409524c66f358f 100644 (file)
@@ -27,6 +27,7 @@
 #define __ASSUME_SIGNALFD4             1
 #define __ASSUME_ACCEPT4_SYSCALL       1
 #define __ASSUME_DUP3                  1
+#define __ASSUME_RECVMMSG_SYSCALL      1
 
 #include_next <kernel-features.h>