From patchwork Mon Apr 29 21:42:12 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Poirier X-Patchwork-Id: 240517 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 7A4D92C00C4 for ; Tue, 30 Apr 2013 07:43:09 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932828Ab3D2Vmk (ORCPT ); Mon, 29 Apr 2013 17:42:40 -0400 Received: from mail-qe0-f44.google.com ([209.85.128.44]:62517 "EHLO mail-qe0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932908Ab3D2Vmh (ORCPT ); Mon, 29 Apr 2013 17:42:37 -0400 Received: by mail-qe0-f44.google.com with SMTP id w7so4394147qeb.3 for ; Mon, 29 Apr 2013 14:42:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=BHJUvdY8PndWKD+IQWakoDFspBKiWfdf4v6DTUzzBz0=; b=hQDZNDol+VcYKjCN7fMdYaRV2g7/IJx/jlHQ10s+cTd6I+qLRzBTD0rS/2HwdQehSn +hOBk1fxM+H75L/+E+ru/D9+xPYbWcSTYG8/p9atYNkS1Q3/xlyohuUS/YlestFzLFO6 SJNVI/vhRYSWJtjqwhLd7vTsp4dY019CVNr34c7sB5v1Ut1hPey8/6+h+px4vHHHVGd+ 1Ld+XbDDjZM5Ng7QUj14jRybKQp6+EBKl9jAbIQdt7oinhBXmZ/MKCVZfQ0p4LugtsOf /R67g/V9LqSRjUP3zx3f2CEmZbxCo3udy0l63Rg2ANXFKIwlavUNadag2larTL6ZhDoO SPvg== X-Received: by 10.224.173.6 with SMTP id n6mr31690092qaz.46.1367271756654; Mon, 29 Apr 2013 14:42:36 -0700 (PDT) Received: from d2.synalogic.ca (modemcable062.27-82-70.mc.videotron.ca. [70.82.27.62]) by mx.google.com with ESMTPSA id en8sm35926648qeb.0.2013.04.29.14.42.34 for (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 29 Apr 2013 14:42:35 -0700 (PDT) From: Benjamin Poirier To: "David S. Miller" , Eric Dumazet , Pavel Emelyanov , Cong Wang Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 1/3] unix/dgram: peek beyond 0-sized skbs Date: Mon, 29 Apr 2013 17:42:12 -0400 Message-Id: <1367271734-14379-1-git-send-email-bpoirier@suse.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org "77c1090 net: fix infinite loop in __skb_recv_datagram()" (v3.8) introduced a regression: After that commit, recv can no longer peek beyond a 0-sized skb in the queue. __skb_recv_datagram() instead stops at the first skb with len == 0 and results in the system call failing with -EFAULT via skb_copy_datagram_iovec(). When peeking at an offset with 0-sized skb(s), each one of those is received only once, in sequence. The offset starts moving forward again after receiving datagrams with len > 0. Signed-off-by: Benjamin Poirier Acked-by: Eric Dumazet --- * v1 fix the case when SO_PEEK_OFF is used to set sk_peek_off beyond a 0-sized skb * v2 also fix the situation when sk_peek_off must advance to and beyond a 0-sized skb net/core/datagram.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/core/datagram.c b/net/core/datagram.c index 368f9c3..99c4f52 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c @@ -187,7 +187,8 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, skb_queue_walk(queue, skb) { *peeked = skb->peeked; if (flags & MSG_PEEK) { - if (*off >= skb->len && skb->len) { + if (*off >= skb->len && (skb->len || *off || + skb->peeked)) { *off -= skb->len; continue; }