Received: by 2002:a17:90a:9103:0:0:0:0 with SMTP id k3csp11819238pjo; Thu, 2 Jan 2020 14:50:37 -0800 (PST) X-Google-Smtp-Source: APXvYqwzSjzL/aTqMWWcVOODCKKorppp5Q7OOnuoN6cxPTlhQ3bhKYd0JyC1t6WYikFuCG2ubDaq X-Received: by 2002:a9d:402:: with SMTP id 2mr35673360otc.357.1578005437220; Thu, 02 Jan 2020 14:50:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578005437; cv=none; d=google.com; s=arc-20160816; b=Cv+8KLxAg8Sjx29Z87J/p4G44LvgdgFPhLjDR+MBYuDMwQ/0qQKTW6Q8YGQsozYLNg uzBTuUqczU7vYC3Z1Jn+DxcLdtrwra9KC26OQeExS2EBe70YxJFISUKKRYzL0ehoWeBS ZVW8QKQG3YJpQ+XWhrFkI/vBVdZqPJfJi8zt+eO40DFDfnenYKx5ynMVk4L227h3bobj 0CWkltCjtUMUsvV4khqMvA6CRVpndR4Z3S4F1YsnLsI1Y1Q2r2sGfLXZwDJQkG3Y15hk T/3iXvRYUmzrR4IeuG5IMSiz0HWHu504dT9g3F33wl7596+iEs08YTfsRQR++ib+MO/B 87Xg== 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=5f49Er3J70ac9BWuUUWHxROGtqqMMK9d9b0HEiXy8pw=; b=zKHtaXTfcjMX1xB8oYzaPQZLhUhD9uT7r486erC+oYW+RNXzUWTVUY3iUZPBpt4TYv nZoMkIpqhy8FT/qu8AP1pYWeZWE4ltb2p/SyI+wkerszCfxhkDzo8TvoeHgbiq7u03Ip rWwonKIdWcKTp1m+Lq02Dc0xHaIfSF0LRReIkq1zuFxTSZ4MPb7iDN07CoUjSRcdnTHj GwMTJVuHhP1vi+PmMzVjaDrmLzJ9vhnSEcf3RTgDG9JdccFxZ4NUt9tvi0fMsGoJiEti t21qM0fiV8PWA33HOS2ZL9D0A9VrEBb0TQ/wlOAiBbhwYWXuyiqn8d5zHhAYHhxQqEyW vcrg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=MCQzyw1z; 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 h128si27851983oif.258.2020.01.02.14.50.25; Thu, 02 Jan 2020 14:50: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=MCQzyw1z; 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 S1730380AbgABWtO (ORCPT + 99 others); Thu, 2 Jan 2020 17:49:14 -0500 Received: from mail.kernel.org ([198.145.29.99]:54988 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729692AbgABW1C (ORCPT ); Thu, 2 Jan 2020 17:27:02 -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 573F120863; Thu, 2 Jan 2020 22:27:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578004021; bh=U91LhnmEMjYOi3Oo29SjooxKMkH9Z6LjFhSMF75SUDg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MCQzyw1zKBmshPE9QeGzrrjAuPXsTB4AU1DdMil/INMW+bq+rqYHow+x1d68tS2Dq G5179up3ci+Zj45Y9xJ2GV2denk4CGcleuH9jiSglSzZheMlx8DJbmAD1mjvGzPuIg 8Q5Mw1auNAddMbzU4rufhS+cgKcuD/t7X6Z+qyms= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Taehee Yoo , Jakub Kicinski Subject: [PATCH 4.14 89/91] gtp: fix wrong condition in gtp_genl_dump_pdp() Date: Thu, 2 Jan 2020 23:08:11 +0100 Message-Id: <20200102220453.112109771@linuxfoundation.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200102220356.856162165@linuxfoundation.org> References: <20200102220356.856162165@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 @@ -42,7 +42,6 @@ struct pdp_ctx { struct hlist_node hlist_addr; union { - u64 tid; struct { u64 tid; u16 flow; @@ -1247,43 +1246,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; }