From patchwork Mon May 16 22:59:24 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Blanchard X-Patchwork-Id: 95843 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id B7D54B6EE9 for ; Tue, 17 May 2011 08:59:40 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755377Ab1EPW73 (ORCPT ); Mon, 16 May 2011 18:59:29 -0400 Received: from ozlabs.org ([203.10.76.45]:59921 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755255Ab1EPW73 (ORCPT ); Mon, 16 May 2011 18:59:29 -0400 Received: from kryten (ppp121-44-139-179.lns20.syd7.internode.on.net [121.44.139.179]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPSA id C7781B6EE9; Tue, 17 May 2011 08:59:26 +1000 (EST) Date: Tue, 17 May 2011 08:59:24 +1000 From: Anton Blanchard To: acme@redhat.com, davem@davemloft.net Cc: netdev@vger.kernel.org Subject: [PATCH] net: recvmmsg: Strip MSG_WAITFORONE when calling recvmsg Message-ID: <20110517085924.3a47b8e2@kryten> X-Mailer: Claws Mail 3.7.8 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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 Cc: stable@kernel.org [2.6.34+] --- We could also add MSG_WAITFORONE to the raw socket recvmsg check, or just remove the check completely. Thoughts? -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Index: linux-net/net/socket.c =================================================================== --- linux-net.orig/net/socket.c 2011-05-09 08:59:22.757767314 +1000 +++ linux-net/net/socket.c 2011-05-16 17:14:52.501268819 +1000 @@ -2232,14 +2232,16 @@ int __sys_recvmmsg(int fd, struct mmsghd */ 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);