summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2011-05-17 15:38:57 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-06-03 10:33:34 +0900
commitad8ba6a764a5bb3a1e6f878b489b7842081e33fc (patch)
tree6403560aa73467c3e002166d6a59bca0aa8fb073 /net
parenta5ba67df5b332a1e9bd73f6954285a3284f86e71 (diff)
downloadlwn-ad8ba6a764a5bb3a1e6f878b489b7842081e33fc.tar.gz
lwn-ad8ba6a764a5bb3a1e6f878b489b7842081e33fc.zip
net: recvmmsg: Strip MSG_WAITFORONE when calling recvmsg
commit b9eb8b8752804cecbacdb4d24b52e823cf07f107 upstream. recvmmsg fails on a raw socket with EINVAL. The reason for this is packet_recvmsg checks the incoming flags: err = -EINVAL; if (flags & ~(MSG_PEEK|MSG_DONTWAIT|MSG_TRUNC|MSG_CMSG_COMPAT|MSG_ERRQUEUE)) goto out; This patch strips out MSG_WAITFORONE when calling recvmmsg which fixes the issue. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'net')
-rw-r--r--net/socket.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/net/socket.c b/net/socket.c
index 29c7df0ed3f8..1204afdfac6e 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2117,14 +2117,16 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
*/
if (MSG_CMSG_COMPAT & flags) {
err = __sys_recvmsg(sock, (struct msghdr __user *)compat_entry,
- &msg_sys, flags, datagrams);
+ &msg_sys, flags & ~MSG_WAITFORONE,
+ datagrams);
if (err < 0)
break;
err = __put_user(err, &compat_entry->msg_len);
++compat_entry;
} else {
err = __sys_recvmsg(sock, (struct msghdr __user *)entry,
- &msg_sys, flags, datagrams);
+ &msg_sys, flags & ~MSG_WAITFORONE,
+ datagrams);
if (err < 0)
break;
err = put_user(err, &entry->msg_len);