Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp2461792yba; Mon, 15 Apr 2019 12:08:39 -0700 (PDT) X-Google-Smtp-Source: APXvYqyUtas65AZ0bau7IK3YD+49Nbv1J5KBS/Lu1IUQEyy+jwcfNT9TfRnhZo2mk37voOL4XgNr X-Received: by 2002:a63:ff26:: with SMTP id k38mr71543657pgi.123.1555355319085; Mon, 15 Apr 2019 12:08:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1555355319; cv=none; d=google.com; s=arc-20160816; b=HYjQBeSae5+tvphDn3YyXCq7GxEcyR+i4AAITYlnvC4euSEmEa/nG430A42hadFuGh hZH0m1VcmZI5k3T88XZoa+E9PbJxj7+JzOy9SOBs/yoowVAqftV6yd+HQlhjrxhM6ZRV YqWmWOnifhyV/y3OWiX6LpTMtl/mboTPIWLaTzI0slRX5aR2zgp+YfBOwUmApzs6SCue 9sUCLllgzB0Fwxw3sGnVIYf0hZHVbnBaCWy+tHxf//+FHiES0dZzuVj7YG5qxwvfTR95 Ly7J/fQwNvY7x/oBXJ3vU6HXcB1a4cuADL7bkaH9LyiVerKOLY4XNApveVJCQW+Y3wff acww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=QsIFUFHd92Qg7/HFTnxoWhXSnvgOA5Vr/B+ZrRWqc2E=; b=w39mdLzh2Z00ExMXTh0tcz/o5F2LVnn+8938ECAZIztajRJxGFUVn6taWrat5oOiCU VBlx4nmOD3kBFvGXomIeGTgWVicm2j+HQHH+6snPSdTSDQ/Rjlg0LZcjA1oUdsJqzAPz uPWjwMDNiw0iiFe+ZpC5/6O+aFDrrqcK3GT50zBAxeJj9B85YUwiZWhw0THAPsNITafo dv2PG8hsgSwBf6+8hnLr2C6fElKP+QHzZ7QgBDBH3m5LJ6WGlHyHsQhX3sl7Phq58nbl b0Qc4DUyQpQPBw32hqbOEBhnzmKCX3wEfKHfnAIG4+Y+R0HpAhjRCRmcQRXUgU62r02l 7nbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=eckoPQoI; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j187si30881872pfc.181.2019.04.15.12.08.22; Mon, 15 Apr 2019 12:08:39 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=eckoPQoI; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729805AbfDOTFz (ORCPT + 99 others); Mon, 15 Apr 2019 15:05:55 -0400 Received: from mail.kernel.org ([198.145.29.99]:39860 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729796AbfDOTFw (ORCPT ); Mon, 15 Apr 2019 15:05:52 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D2EA62087C; Mon, 15 Apr 2019 19:05:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1555355151; bh=YgJP8LPJWE1fttp1UkK4cPW97RAhni5HTj/ZTvGpHBo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eckoPQoISjjEyGWIN3uY1GNzBgFF3EMk2wb9vdUP9E3vjpGY+bEPMHzJVVeYdsuqr 5Fmiyul5rZLAtrcgwswqMD01WNVqG3JRar6RIEOEFTSpc54rnTeU/AqGtStZrTPyZ/ ZPoZstHYgEYpPPWSbrCsUt7Dl3GN5q94NjctJ29I= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Matteo Croce , Davide Caratti , Yotam Gigi , "David S. Miller" , Sasha Levin Subject: [PATCH 4.19 015/101] net/sched: act_sample: fix divide by zero in the traffic path Date: Mon, 15 Apr 2019 20:58:13 +0200 Message-Id: <20190415183741.183975442@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190415183740.341577907@linuxfoundation.org> References: <20190415183740.341577907@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [ Upstream commit fae2708174ae95d98d19f194e03d6e8f688ae195 ] the control path of 'sample' action does not validate the value of 'rate' provided by the user, but then it uses it as divisor in the traffic path. Validate it in tcf_sample_init(), and return -EINVAL with a proper extack message in case that value is zero, to fix a splat with the script below: # tc f a dev test0 egress matchall action sample rate 0 group 1 index 2 # tc -s a s action sample total acts 1 action order 0: sample rate 1/0 group 1 pipe index 2 ref 1 bind 1 installed 19 sec used 19 sec Action statistics: Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 # ping 192.0.2.1 -I test0 -c1 -q divide error: 0000 [#1] SMP PTI CPU: 1 PID: 6192 Comm: ping Not tainted 5.1.0-rc2.diag2+ #591 Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 RIP: 0010:tcf_sample_act+0x9e/0x1e0 [act_sample] Code: 6a f1 85 c0 74 0d 80 3d 83 1a 00 00 00 0f 84 9c 00 00 00 4d 85 e4 0f 84 85 00 00 00 e8 9b d7 9c f1 44 8b 8b e0 00 00 00 31 d2 <41> f7 f1 85 d2 75 70 f6 85 83 00 00 00 10 48 8b 45 10 8b 88 08 01 RSP: 0018:ffffae320190ba30 EFLAGS: 00010246 RAX: 00000000b0677d21 RBX: ffff8af1ed9ec000 RCX: 0000000059a9fe49 RDX: 0000000000000000 RSI: 000000000c7e33b7 RDI: ffff8af23daa0af0 RBP: ffff8af1ee11b200 R08: 0000000074fcaf7e R09: 0000000000000000 R10: 0000000000000050 R11: ffffffffb3088680 R12: ffff8af232307f80 R13: 0000000000000003 R14: ffff8af1ed9ec000 R15: 0000000000000000 FS: 00007fe9c6d2f740(0000) GS:ffff8af23da80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007fff6772f000 CR3: 00000000746a2004 CR4: 00000000001606e0 Call Trace: tcf_action_exec+0x7c/0x1c0 tcf_classify+0x57/0x160 __dev_queue_xmit+0x3dc/0xd10 ip_finish_output2+0x257/0x6d0 ip_output+0x75/0x280 ip_send_skb+0x15/0x40 raw_sendmsg+0xae3/0x1410 sock_sendmsg+0x36/0x40 __sys_sendto+0x10e/0x140 __x64_sys_sendto+0x24/0x30 do_syscall_64+0x60/0x210 entry_SYSCALL_64_after_hwframe+0x49/0xbe [...] Kernel panic - not syncing: Fatal exception in interrupt Add a TDC selftest to document that 'rate' is now being validated. Reported-by: Matteo Croce Fixes: 5c5670fae430 ("net/sched: Introduce sample tc action") Signed-off-by: Davide Caratti Acked-by: Yotam Gigi Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/sched/act_sample.c | 10 ++++++-- .../tc-testing/tc-tests/actions/sample.json | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/net/sched/act_sample.c b/net/sched/act_sample.c index 6b67aa13d2dd..c7f5d630d97c 100644 --- a/net/sched/act_sample.c +++ b/net/sched/act_sample.c @@ -43,8 +43,8 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, struct tc_action_net *tn = net_generic(net, sample_net_id); struct nlattr *tb[TCA_SAMPLE_MAX + 1]; struct psample_group *psample_group; + u32 psample_group_num, rate; struct tc_sample *parm; - u32 psample_group_num; struct tcf_sample *s; bool exists = false; int ret, err; @@ -80,6 +80,12 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, return -EEXIST; } + rate = nla_get_u32(tb[TCA_SAMPLE_RATE]); + if (!rate) { + NL_SET_ERR_MSG(extack, "invalid sample rate"); + tcf_idr_release(*a, bind); + return -EINVAL; + } psample_group_num = nla_get_u32(tb[TCA_SAMPLE_PSAMPLE_GROUP]); psample_group = psample_group_get(net, psample_group_num); if (!psample_group) { @@ -91,7 +97,7 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, spin_lock_bh(&s->tcf_lock); s->tcf_action = parm->action; - s->rate = nla_get_u32(tb[TCA_SAMPLE_RATE]); + s->rate = rate; s->psample_group_num = psample_group_num; RCU_INIT_POINTER(s->psample_group, psample_group); diff --git a/tools/testing/selftests/tc-testing/tc-tests/actions/sample.json b/tools/testing/selftests/tc-testing/tc-tests/actions/sample.json index 3aca33c00039..618def9bdf0e 100644 --- a/tools/testing/selftests/tc-testing/tc-tests/actions/sample.json +++ b/tools/testing/selftests/tc-testing/tc-tests/actions/sample.json @@ -143,6 +143,30 @@ "$TC actions flush action sample" ] }, + { + "id": "7571", + "name": "Add sample action with invalid rate", + "category": [ + "actions", + "sample" + ], + "setup": [ + [ + "$TC actions flush action sample", + 0, + 1, + 255 + ] + ], + "cmdUnderTest": "$TC actions add action sample rate 0 group 1 index 2", + "expExitCode": "255", + "verifyCmd": "$TC actions get action sample index 2", + "matchPattern": "action order [0-9]+: sample rate 1/0 group 1.*index 2 ref", + "matchCount": "0", + "teardown": [ + "$TC actions flush action sample" + ] + }, { "id": "b6d4", "name": "Add sample action with mandatory arguments and invalid control action", -- 2.19.1