From patchwork Fri Mar 17 15:05:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 740348 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 3vl7vx4FkLz9ryj for ; Sat, 18 Mar 2017 02:06:21 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="IKfxTcJD"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751449AbdCQPGJ (ORCPT ); Fri, 17 Mar 2017 11:06:09 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:34964 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751311AbdCQPGF (ORCPT ); Fri, 17 Mar 2017 11:06:05 -0400 Received: by mail-pg0-f66.google.com with SMTP id g2so10201162pge.2 for ; Fri, 17 Mar 2017 08:05:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:subject:from:to:cc:date:mime-version :content-transfer-encoding; bh=dacdlfljSInfgwDuYiBY4K0+1BnVqnfmpwHSsySkd3w=; b=IKfxTcJDA/HWtwupTVlHjAaDS1Z7AMeIXnBXVNdhq6++ZrR42ncmorMmqF+mz0syZe rl3nESBBwMHrGnG38m44Z+9SvOC4UWZLk9KqbNHDmkG6rHCIu5muwkWL5Nuqh1qp0IUA CRVXW2tyN6Y79DD6QWXr0dGJMYXFDzM1Mnb25bh4/3ptEtqXkdagZEkOT0ZbT37ScoAm zXWe1Mr43ZvZ+xKROgBfMkC6Y7q+fhLuH10qYshHr0XhHZBuJPI2D8O0EFFwFglUIo9h Ge9ZfLf+ogfbcx0rS0rY3bNwCUEZrHPF0qoM2PN6yno02D0ikwPYRIsCR9Btem7IPLg0 WWkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:mime-version :content-transfer-encoding; bh=dacdlfljSInfgwDuYiBY4K0+1BnVqnfmpwHSsySkd3w=; b=E8Kh50KRTDsHMlTAIKLHx3PrY9Gx8EXtF8VI6Mx6ynL0g81ALTuK4wm92pwQq1rfG3 TPRhcno3gFEJxEfNN8rhFlNXgeqdkIkzYWpqhJZ9OMr/qC3p95fu+uM2fc/3xq/EIeSo UyL1vkhdpljCpKmTjBoHOuRcj3UNfY0xykUxrbl6w0MGTI0y1pAYLlIQHDVMbppMHFVs oYD04QyF9ChP4w+1vrkoJzS9wIib5N/CDFhleo8m3lJgS+7kq7euK/qgz8a+SGPNhfLG DiWtKvm5L5IoxnPDIbnKWgzjUlARCC4eBCt7SRqG6oLWbe/xC65d1DUBI13328oPUWT0 BKCQ== X-Gm-Message-State: AFeK/H3n3Cxq1AHWNGdeaXqFoXWf2GMxKWnJiblOtWDUCDgmMKKr3Mulwe8Peg2pa9YweA== X-Received: by 10.98.0.14 with SMTP id 14mr17483479pfa.173.1489763129625; Fri, 17 Mar 2017 08:05:29 -0700 (PDT) Received: from ?IPv6:2620:0:1000:1704:9c83:e4d8:150c:3d17? ([2620:0:1000:1704:9c83:e4d8:150c:3d17]) by smtp.googlemail.com with ESMTPSA id v17sm7349067pgc.20.2017.03.17.08.05.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Mar 2017 08:05:28 -0700 (PDT) Message-ID: <1489763128.28631.286.camel@edumazet-glaptop3.roam.corp.google.com> Subject: [PATCH net] sch_dsmark: fix invalid skb_cow() usage From: Eric Dumazet To: David Miller Cc: netdev , Stephen Hemminger , Wei Wang Date: Fri, 17 Mar 2017 08:05:28 -0700 X-Mailer: Evolution 3.10.4-0ubuntu2 Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Eric Dumazet skb_cow(skb, sizeof(ip header)) is not very helpful in this context. First we need to use pskb_may_pull() to make sure the ip header is in skb linear part, then use skb_try_make_writable() to address clones issues. Fixes: 4c30719f4f55 ("[PKT_SCHED] dsmark: handle cloned and non-linear skb's") Signed-off-by: Eric Dumazet --- net/sched/sch_dsmark.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c index 802ac7c2e5e87eed1341ba4c09d3e5d70bc75876..5334e309f17f0ef4416dddcdc9278c14ecb5585d 100644 --- a/net/sched/sch_dsmark.c +++ b/net/sched/sch_dsmark.c @@ -201,9 +201,13 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch, pr_debug("%s(skb %p,sch %p,[qdisc %p])\n", __func__, skb, sch, p); if (p->set_tc_index) { + int wlen = skb_network_offset(skb); + switch (tc_skb_protocol(skb)) { case htons(ETH_P_IP): - if (skb_cow_head(skb, sizeof(struct iphdr))) + wlen += sizeof(struct iphdr); + if (!pskb_may_pull(skb, wlen) || + skb_try_make_writable(skb, wlen)) goto drop; skb->tc_index = ipv4_get_dsfield(ip_hdr(skb)) @@ -211,7 +215,9 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch, break; case htons(ETH_P_IPV6): - if (skb_cow_head(skb, sizeof(struct ipv6hdr))) + wlen += sizeof(struct ipv6hdr); + if (!pskb_may_pull(skb, wlen) || + skb_try_make_writable(skb, wlen)) goto drop; skb->tc_index = ipv6_get_dsfield(ipv6_hdr(skb))