From nobody Wed Dec 6 14:41:33 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Slg8F5P29z53XBD; Wed, 6 Dec 2023 14:41:33 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Slg8F4XnSz4JQd; Wed, 6 Dec 2023 14:41:33 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1701873693; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=3KrYorFUj8Yww/2YaTfZJ1a/Zs4NLjMSJqcEgufMbaM=; b=KEh38+M2bhov27IVxPICzGmKfrbImlAzqpm7NhBExuqFF3EIeh8EFfseXHqyv2E4GD/VGd KYXzEA8dcsAWRhX6pI+T6bJdBJ2gDVqnajjdUi+UK7c6NTntNA0JVrfMC+EpTTo9iBQewR eu+pnjF91/mVcOdyLDXSvF0RUgvLRzHbYNL+wbF/umxxAC0QlKw2V143x99XQX/U8U7AL7 p0lvfcEKlj8txDxlvq/s9w+i8wgXzx6mWFVBpeHMrDyNa+NLZ3nCIjULOoP4Xhi/T6d0y5 ZSZffs9XNyeMkeNjULIP74K6O3aHjj8mg/ZmKG9dFD2w49HaNU+Xby50L16MJQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1701873693; a=rsa-sha256; cv=none; b=SGcS5sDLugEzP6Q3/eWS4oGA1tMYrDqb39PFGTHq9RfpwVAsdVafufOUqoFkxInqcODyDb iyKbCXW3gkjjoZpQAA76W11m9nSvCyRWk0G2d3eqjsJ6cflj6I/GS/7FZ5WrhEqq0gGSCz 9SLqSjLuoDVzl36yGqtx0TXVQoJkNjodazm3GL+iyV02KREwTLv76+Bw8zwEiw4YGHQxea ateoAQ4PcG+WSxzNFXrjJ0nQnpqmqv3AqzkUlif/ik9OujU4tETtBgUoARJNUDPbfzNqL5 +4aB1sipksHPEq3iP3KH91V/ODrvYgm3648XBz0UDeEYlWTXciFGyrU4Y6iEow== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1701873693; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=3KrYorFUj8Yww/2YaTfZJ1a/Zs4NLjMSJqcEgufMbaM=; b=PtUrq1nSbZJARApGEscGVXbwsX9h9l9ArixBHe/54FVGI+8uOGMkfLK4Ezv5ostWYA6gJn ySpgjH4lqZQDi8Zh6PTWK5r6ZN9ZjhWn80rNvJ9i+P/pbkpJXY0jLJ0+LuJA5ombS4/IX6 Ji/cEPdk3QcVifNusy0MnKH1oeUkeH+R4G49Q5KOGKtL+talZAbPZZIN7Mi3Z3/oJQkC/g upBwZcBVN8+fROeARAgRWbVw/cEMj4KQxFsqnxXPKfGiZDCraqeAbqJNo9sRtz0c3Wntyt +FUpf7Cc05+GD6Lmu5mB4HzuUhRi/mDan2+TyUZq83ocpkR5NzrFapEayohOgQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Slg8F3d6tzwx9; Wed, 6 Dec 2023 14:41:33 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3B6EfXCL045863; Wed, 6 Dec 2023 14:41:33 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3B6EfXEf045860; Wed, 6 Dec 2023 14:41:33 GMT (envelope-from git) Date: Wed, 6 Dec 2023 14:41:33 GMT Message-Id: <202312061441.3B6EfXEf045860@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kristof Provost Subject: git: 285b505a4ee0 - stable/14 - pf: fix mem leaks upon vnet destroy List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kp X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 285b505a4ee0ab2fdc8f970e7d23a6d3091dc686 Auto-Submitted: auto-generated The branch stable/14 has been updated by kp: URL: https://cgit.FreeBSD.org/src/commit/?id=285b505a4ee0ab2fdc8f970e7d23a6d3091dc686 commit 285b505a4ee0ab2fdc8f970e7d23a6d3091dc686 Author: Igor Ostapenko AuthorDate: 2023-11-29 12:35:41 +0000 Commit: Kristof Provost CommitDate: 2023-12-06 09:08:25 +0000 pf: fix mem leaks upon vnet destroy Add missing cleanup actions: - remove user defined anchor rulesets - remove user defined ether anchor rulesets - remove tables linked to user defined anchors - deal with wildcard anchor peculiarities to get them removed correctly PR: 274310 Reviewed by: kp MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D42747 (cherry picked from commit 0626d30e41cba64b41667314c3a4f7611f0eb685) --- sys/netpfil/pf/pf_ioctl.c | 67 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/sys/netpfil/pf/pf_ioctl.c b/sys/netpfil/pf/pf_ioctl.c index de43570176cb..a397b9e99261 100644 --- a/sys/netpfil/pf/pf_ioctl.c +++ b/sys/netpfil/pf/pf_ioctl.c @@ -6028,6 +6028,7 @@ pf_clear_tables(void) int error; bzero(&io, sizeof(io)); + io.pfrio_flags |= PFR_FLAG_ALLRSETS; error = pfr_clr_tables(&io.pfrio_table, &io.pfrio_ndel, io.pfrio_flags); @@ -6438,8 +6439,54 @@ shutdown_pf(void) int error = 0; u_int32_t t[5]; char nn = '\0'; + struct pf_kanchor *anchor; + struct pf_keth_anchor *eth_anchor; + int rs_num; do { + /* Unlink rules of all user defined anchors */ + RB_FOREACH(anchor, pf_kanchor_global, &V_pf_anchors) { + /* Wildcard based anchors may not have a respective + * explicit anchor rule or they may be left empty + * without rules. It leads to anchor.refcnt=0, and the + * rest of the logic does not expect it. */ + if (anchor->refcnt == 0) + anchor->refcnt = 1; + for (rs_num = 0; rs_num < PF_RULESET_MAX; ++rs_num) { + if ((error = pf_begin_rules(&t[rs_num], rs_num, + anchor->path)) != 0) { + DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: " + "anchor.path=%s rs_num=%d\n", + anchor->path, rs_num)); + goto error; /* XXX: rollback? */ + } + } + for (rs_num = 0; rs_num < PF_RULESET_MAX; ++rs_num) { + error = pf_commit_rules(t[rs_num], rs_num, + anchor->path); + MPASS(error == 0); + } + } + + /* Unlink rules of all user defined ether anchors */ + RB_FOREACH(eth_anchor, pf_keth_anchor_global, + &V_pf_keth_anchors) { + /* Wildcard based anchors may not have a respective + * explicit anchor rule or they may be left empty + * without rules. It leads to anchor.refcnt=0, and the + * rest of the logic does not expect it. */ + if (eth_anchor->refcnt == 0) + eth_anchor->refcnt = 1; + if ((error = pf_begin_eth(&t[0], eth_anchor->path)) + != 0) { + DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: eth " + "anchor.path=%s\n", eth_anchor->path)); + goto error; + } + error = pf_commit_eth(t[0], eth_anchor->path); + MPASS(error == 0); + } + if ((error = pf_begin_rules(&t[0], PF_RULESET_SCRUB, &nn)) != 0) { DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: SCRUB\n")); @@ -6466,12 +6513,16 @@ shutdown_pf(void) break; /* XXX: rollback? */ } - /* XXX: these should always succeed here */ - pf_commit_rules(t[0], PF_RULESET_SCRUB, &nn); - pf_commit_rules(t[1], PF_RULESET_FILTER, &nn); - pf_commit_rules(t[2], PF_RULESET_NAT, &nn); - pf_commit_rules(t[3], PF_RULESET_BINAT, &nn); - pf_commit_rules(t[4], PF_RULESET_RDR, &nn); + error = pf_commit_rules(t[0], PF_RULESET_SCRUB, &nn); + MPASS(error == 0); + error = pf_commit_rules(t[1], PF_RULESET_FILTER, &nn); + MPASS(error == 0); + error = pf_commit_rules(t[2], PF_RULESET_NAT, &nn); + MPASS(error == 0); + error = pf_commit_rules(t[3], PF_RULESET_BINAT, &nn); + MPASS(error == 0); + error = pf_commit_rules(t[4], PF_RULESET_RDR, &nn); + MPASS(error == 0); if ((error = pf_clear_tables()) != 0) break; @@ -6480,7 +6531,8 @@ shutdown_pf(void) DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: eth\n")); break; } - pf_commit_eth(t[0], &nn); + error = pf_commit_eth(t[0], &nn); + MPASS(error == 0); #ifdef ALTQ if ((error = pf_begin_altq(&t[0])) != 0) { @@ -6498,6 +6550,7 @@ shutdown_pf(void) /* fingerprints and interfaces have their own cleanup code */ } while(0); +error: return (error); }