Received: by 2002:a17:90a:9103:0:0:0:0 with SMTP id k3csp11790193pjo; Thu, 2 Jan 2020 14:19:37 -0800 (PST) X-Google-Smtp-Source: APXvYqw+ga0oZYXZMQx7h/qxHCUlFUqqk4hN5OdZUObrkz4gYGaoR1RFLSd8h8CRTcDvujCK28gM X-Received: by 2002:a9d:7f16:: with SMTP id j22mr92230677otq.256.1578003577395; Thu, 02 Jan 2020 14:19:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578003577; cv=none; d=google.com; s=arc-20160816; b=UIeg3Dv0MZq8nshuK78hmwfG6ITYKka3FrPmplzQlXEtTNWE1Zz4nUsVINvOaxttSM GvmkChJmvNB91ca2gZ8M5JVUrJj5Nxnv8SHZE/2W4g8u5+tXJMc3bz7NqenoLIaAkMEw uGvnxAj7TzijiVCXXu3OGyk3b88h4FNmx2VOdEeAb/IntuSJSdbCPW0pQ2ksgUmEY/9u fndKtG6d8uXbURchMjL1J4a5Du017Tz3UFiS9hLkU0o8tnUr7K/0fJ9Av4Nx12SBceiG i4k7gZeqrKJhLhS1h1pWMC3D/v3mxRCQQCZZzsVwudoEEx4xnhwy+zsIDstjcN6VoTx8 Z3+g== 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=2X7ojAC+x/7EZSXK7fB4TBC2RmhlZQwMsx+AEi5iSIc=; b=Yv0V+R4JULtW6+GGjtuV6npnwXiRuByimIQuiycFCsP539rOk2QoGWiErVXp31FPjf mpJBDopObj140G3s7GGaBxNePIylGzPHnrueiKxXIQCIDxEXIQtJOpOTkBjFEJwig80A DMXzO4pp+EKqHudDQkPwZKOQbMw3/mHwnzKvsO7keGUQ6c3ciWBfXMT42H6g3LiE4zw2 LEaTnjSFPwLmp948GgajH0jTWXN8RC9MaFsAnOfZTx5daHRkawb/9LQgdrwqv52OXBJF dz00QK13fhz/GiQqwoXfS6rFEKNl+hsSQ0NFcGqI8az39LBZcApiXgD8/Um3+NYa3rsH sfvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=vmFkZBhd; 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 w7si29574723otq.250.2020.01.02.14.19.25; Thu, 02 Jan 2020 14:19:37 -0800 (PST) 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=vmFkZBhd; 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 S1728255AbgABWSt (ORCPT + 99 others); Thu, 2 Jan 2020 17:18:49 -0500 Received: from mail.kernel.org ([198.145.29.99]:34236 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728474AbgABWSo (ORCPT ); Thu, 2 Jan 2020 17:18:44 -0500 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 B055D2253D; Thu, 2 Jan 2020 22:18:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578003524; bh=TiQKsBH6qvvSVNlJLrbTeIM1B76u/SMbKkb611bLAdY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vmFkZBhdCnsUMRBhY8QlRG0RlVJTImvjV+ekEHeQd38xCKYi/65FbLKrMiHlW6Idt CpYxcnlKWfm3DNaSHMz9tuc7XTbJOKCH0Af5mNKpJnkCXh5n1mfHUNJrjGDAB8FU5N DXRjDDhP4f4luPFHLnK7Igj80nAaQwW74TJSqR7U= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Taehee Yoo , Jakub Kicinski Subject: [PATCH 5.4 177/191] gtp: fix wrong condition in gtp_genl_dump_pdp() Date: Thu, 2 Jan 2020 23:07:39 +0100 Message-Id: <20200102215848.247649694@linuxfoundation.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200102215829.911231638@linuxfoundation.org> References: <20200102215829.911231638@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 From: Taehee Yoo [ Upstream commit 94a6d9fb88df43f92d943c32b84ce398d50bf49f ] gtp_genl_dump_pdp() is ->dumpit() callback of GTP module and it is used to dump pdp contexts. it would be re-executed because of dump packet size. If dump packet size is too big, it saves current dump pointer (gtp interface pointer, bucket, TID value) then it restarts dump from last pointer. Current GTP code allows adding zero TID pdp context but dump code ignores zero TID value. So, last dump pointer will not be found. In addition, this patch adds missing rcu_read_lock() in gtp_genl_dump_pdp(). Fixes: 459aa660eb1d ("gtp: add initial driver for datapath of GPRS Tunneling Protocol (GTP-U)") Signed-off-by: Taehee Yoo Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- drivers/net/gtp.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) --- a/drivers/net/gtp.c +++ b/drivers/net/gtp.c @@ -38,7 +38,6 @@ struct pdp_ctx { struct hlist_node hlist_addr; union { - u64 tid; struct { u64 tid; u16 flow; @@ -1232,43 +1231,46 @@ static int gtp_genl_dump_pdp(struct sk_b struct netlink_callback *cb) { struct gtp_dev *last_gtp = (struct gtp_dev *)cb->args[2], *gtp; + int i, j, bucket = cb->args[0], skip = cb->args[1]; struct net *net = sock_net(skb->sk); - struct gtp_net *gn = net_generic(net, gtp_net_id); - unsigned long tid = cb->args[1]; - int i, k = cb->args[0], ret; struct pdp_ctx *pctx; + struct gtp_net *gn; + + gn = net_generic(net, gtp_net_id); if (cb->args[4]) return 0; + rcu_read_lock(); list_for_each_entry_rcu(gtp, &gn->gtp_dev_list, list) { if (last_gtp && last_gtp != gtp) continue; else last_gtp = NULL; - for (i = k; i < gtp->hash_size; i++) { - hlist_for_each_entry_rcu(pctx, >p->tid_hash[i], hlist_tid) { - if (tid && tid != pctx->u.tid) - continue; - else - tid = 0; - - ret = gtp_genl_fill_info(skb, - NETLINK_CB(cb->skb).portid, - cb->nlh->nlmsg_seq, - cb->nlh->nlmsg_type, pctx); - if (ret < 0) { + for (i = bucket; i < gtp->hash_size; i++) { + j = 0; + hlist_for_each_entry_rcu(pctx, >p->tid_hash[i], + hlist_tid) { + if (j >= skip && + gtp_genl_fill_info(skb, + NETLINK_CB(cb->skb).portid, + cb->nlh->nlmsg_seq, + cb->nlh->nlmsg_type, pctx)) { cb->args[0] = i; - cb->args[1] = pctx->u.tid; + cb->args[1] = j; cb->args[2] = (unsigned long)gtp; goto out; } + j++; } + skip = 0; } + bucket = 0; } cb->args[4] = 1; out: + rcu_read_unlock(); return skb->len; }