From patchwork Tue Dec 1 18:47:26 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaldo Carvalho de Melo X-Patchwork-Id: 39928 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.176.167]) by ozlabs.org (Postfix) with ESMTP id CDAFD1007D3 for ; Wed, 2 Dec 2009 05:47:38 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751957AbZLASr0 (ORCPT ); Tue, 1 Dec 2009 13:47:26 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751412AbZLASrZ (ORCPT ); Tue, 1 Dec 2009 13:47:25 -0500 Received: from casper.infradead.org ([85.118.1.10]:52873 "EHLO casper.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751320AbZLASrZ (ORCPT ); Tue, 1 Dec 2009 13:47:25 -0500 Received: from [187.5.57.15] (helo=doppio.ghostprotocols.net) by casper.infradead.org with esmtpsa (Exim 4.69 #1 (Red Hat Linux)) id 1NFXl4-00059G-Lc; Tue, 01 Dec 2009 18:47:31 +0000 Received: by doppio.ghostprotocols.net (Postfix, from userid 500) id 78B402C8; Tue, 1 Dec 2009 16:47:26 -0200 (BRST) From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: netdev@vger.kernel.org, Jean-Mickael Guerin , Arnaldo Carvalho de Melo Subject: [PATCH 1/1] net: compat_mmsghdr must be used in sys_recvmmsg Date: Tue, 1 Dec 2009 16:47:26 -0200 Message-Id: <1259693246-30341-1-git-send-email-acme@infradead.org> X-Mailer: git-send-email 1.6.2.5 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jean-Mickael Guerin Both to traverse the entries and to set the msg_len field. Commiter note: folded two patches and avoided one branch repeating the compat test. Signed-off-by: Jean-Mickael Guerin Signed-off-by: Arnaldo Carvalho de Melo --- net/socket.c | 24 ++++++++++++++++++------ 1 files changed, 18 insertions(+), 6 deletions(-) diff --git a/net/socket.c b/net/socket.c index 402abb3..b94c3dd 100644 --- a/net/socket.c +++ b/net/socket.c @@ -2144,6 +2144,7 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, int fput_needed, err, datagrams; struct socket *sock; struct mmsghdr __user *entry; + struct compat_mmsghdr __user *compat_entry; struct msghdr msg_sys; struct timespec end_time; @@ -2163,19 +2164,30 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, goto out_put; entry = mmsg; + compat_entry = (struct compat_mmsghdr __user *)mmsg; while (datagrams < vlen) { /* * No need to ask LSM for more than the first datagram. */ - err = __sys_recvmsg(sock, (struct msghdr __user *)entry, - &msg_sys, flags, datagrams); - if (err < 0) - break; - err = put_user(err, &entry->msg_len); + if (MSG_CMSG_COMPAT & flags) { + err = __sys_recvmsg(sock, (struct msghdr __user *)compat_entry, + &msg_sys, flags, 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); + if (err < 0) + break; + err = put_user(err, &entry->msg_len); + ++entry; + } + if (err) break; - ++entry; ++datagrams; if (timeout) {