Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp753438imm; Thu, 13 Sep 2018 07:15:43 -0700 (PDT) X-Google-Smtp-Source: ANB0VdY7EBk3lDLECIdYBdmfKXPfAJhb+YR6XY4pe1ACuHPSvqLyo7IgcobgQz9JJsGc/GUh4IVf X-Received: by 2002:a63:a54f:: with SMTP id r15-v6mr7355907pgu.336.1536848143084; Thu, 13 Sep 2018 07:15:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536848143; cv=none; d=google.com; s=arc-20160816; b=u33LBFfHR3i3P9hYTmZHXEYaTEsfo3IVjucjcFyOJqEj2YIwY0Um5smNcEjd9rUjtv rgo0TIZFWGzMfrqufUySn28bR18GGBwLlKXv4dGdQZbPGb0DRFLJHbnCo0EuchETPLQR 9//sOHlT6Wrb+a9+3P7XRhZPB18DCJywdWZBfAdKFgeoh8jTBi5Ioazt7CzPyEfs8eZr 8nSZ1+nrtVlagl3mxtQawQRtIkwms1ykHOXvi7fw7f7cvoX6Xi6r7Tp6/9vxYMuAAE54 ndn/q8/3+F4BxuMS7ZgkM9EuGh9RflsVWHRJCCDqluqtx+PfGLrbKVYwCWDBSRfQY7ac gLmw== 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; bh=a/s4Jt4bajh2Ui0Q1Gw9BGhB4ZJwi/eR9zc8soi7ags=; b=xA2Btl6sbw63PkJFM8fm9kERrwlXHFnjwYSO+p6fb7PRMMh0W9RFfw1k88giRSap1b XqRpZHHJe7POZL4aHr2vdbEKMRXCCzphY9ut5XEnfJJqEeMaV+CZxFNpQjM5lYBJCH/D klPT+88yzf928ECbwPqH7yfJ3vX8WrbgiyPJ5fpY6C4SjAHwN3oe4k8kLNgf2s6pTb1D SW0w/xIrVOj4Ow5DQ35F1iFqqIrmfXioIcWify5/dd9JUIrFx9ydt7DZrhAeTHvRe2gv Yw0cF5M3iMc7WX+MIgnds3k80TSIyBCUi5ZRLFA0FW6bVmc70PFOLJgPvm7NGzE3+ffW HT/g== ARC-Authentication-Results: i=1; mx.google.com; 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 29-v6si4470081pgv.292.2018.09.13.07.15.19; Thu, 13 Sep 2018 07:15:43 -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; 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 S1729942AbeIMSxd (ORCPT + 99 others); Thu, 13 Sep 2018 14:53:33 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:60446 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727365AbeIMSxc (ORCPT ); Thu, 13 Sep 2018 14:53:32 -0400 Received: from localhost (ip-213-127-77-73.ip.prioritytelecom.net [213.127.77.73]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id DA2A7D10; Thu, 13 Sep 2018 13:43:58 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, shaochun chen , Florian Westphal , Pablo Neira Ayuso , Sasha Levin Subject: [PATCH 4.14 043/115] netfilter: fix memory leaks on netlink_dump_start error Date: Thu, 13 Sep 2018 15:31:03 +0200 Message-Id: <20180913131826.341718803@linuxfoundation.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180913131823.327472833@linuxfoundation.org> References: <20180913131823.327472833@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review 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 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Florian Westphal [ Upstream commit 3e673b23b541b8e7f773b2d378d6eb99831741cd ] Shaochun Chen points out we leak dumper filter state allocations stored in dump_control->data in case there is an error before netlink sets cb_running (after which ->done will be called at some point). In order to fix this, add .start functions and move allocations there. Same pattern as used in commit 90fd131afc565159c9e0ea742f082b337e10f8c6 ("netfilter: nf_tables: move dumper state allocation into ->start"). Reported-by: shaochun chen Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- net/netfilter/nf_conntrack_netlink.c | 26 +++++++++++++++++--------- net/netfilter/nfnetlink_acct.c | 29 +++++++++++++---------------- 2 files changed, 30 insertions(+), 25 deletions(-) --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -788,6 +788,21 @@ ctnetlink_alloc_filter(const struct nlat #endif } +static int ctnetlink_start(struct netlink_callback *cb) +{ + const struct nlattr * const *cda = cb->data; + struct ctnetlink_filter *filter = NULL; + + if (cda[CTA_MARK] && cda[CTA_MARK_MASK]) { + filter = ctnetlink_alloc_filter(cda); + if (IS_ERR(filter)) + return PTR_ERR(filter); + } + + cb->data = filter; + return 0; +} + static int ctnetlink_filter_match(struct nf_conn *ct, void *data) { struct ctnetlink_filter *filter = data; @@ -1194,19 +1209,12 @@ static int ctnetlink_get_conntrack(struc if (nlh->nlmsg_flags & NLM_F_DUMP) { struct netlink_dump_control c = { + .start = ctnetlink_start, .dump = ctnetlink_dump_table, .done = ctnetlink_done, + .data = (void *)cda, }; - if (cda[CTA_MARK] && cda[CTA_MARK_MASK]) { - struct ctnetlink_filter *filter; - - filter = ctnetlink_alloc_filter(cda); - if (IS_ERR(filter)) - return PTR_ERR(filter); - - c.data = filter; - } return netlink_dump_start(ctnl, skb, nlh, &c); } --- a/net/netfilter/nfnetlink_acct.c +++ b/net/netfilter/nfnetlink_acct.c @@ -238,29 +238,33 @@ static const struct nla_policy filter_po [NFACCT_FILTER_VALUE] = { .type = NLA_U32 }, }; -static struct nfacct_filter * -nfacct_filter_alloc(const struct nlattr * const attr) +static int nfnl_acct_start(struct netlink_callback *cb) { - struct nfacct_filter *filter; + const struct nlattr *const attr = cb->data; struct nlattr *tb[NFACCT_FILTER_MAX + 1]; + struct nfacct_filter *filter; int err; + if (!attr) + return 0; + err = nla_parse_nested(tb, NFACCT_FILTER_MAX, attr, filter_policy, NULL); if (err < 0) - return ERR_PTR(err); + return err; if (!tb[NFACCT_FILTER_MASK] || !tb[NFACCT_FILTER_VALUE]) - return ERR_PTR(-EINVAL); + return -EINVAL; filter = kzalloc(sizeof(struct nfacct_filter), GFP_KERNEL); if (!filter) - return ERR_PTR(-ENOMEM); + return -ENOMEM; filter->mask = ntohl(nla_get_be32(tb[NFACCT_FILTER_MASK])); filter->value = ntohl(nla_get_be32(tb[NFACCT_FILTER_VALUE])); + cb->data = filter; - return filter; + return 0; } static int nfnl_acct_get(struct net *net, struct sock *nfnl, @@ -275,18 +279,11 @@ static int nfnl_acct_get(struct net *net if (nlh->nlmsg_flags & NLM_F_DUMP) { struct netlink_dump_control c = { .dump = nfnl_acct_dump, + .start = nfnl_acct_start, .done = nfnl_acct_done, + .data = (void *)tb[NFACCT_FILTER], }; - if (tb[NFACCT_FILTER]) { - struct nfacct_filter *filter; - - filter = nfacct_filter_alloc(tb[NFACCT_FILTER]); - if (IS_ERR(filter)) - return PTR_ERR(filter); - - c.data = filter; - } return netlink_dump_start(nfnl, skb, nlh, &c); }