diff options
author | Kristof Provost <kp@FreeBSD.org> | 2022-09-01 08:16:24 +0000 |
---|---|---|
committer | Kristof Provost <kp@FreeBSD.org> | 2022-09-06 08:42:10 +0000 |
commit | 585a5ed0bef4a0b874c8fa495ae53901799759c3 (patch) | |
tree | 5922972c33a750756ba707bfb8696a1cfcd42345 /sbin/pfctl/parse.y | |
parent | ed5eb77e187286028e839dc4f03b12c99e586a00 (diff) | |
download | src-585a5ed0bef4a0b874c8fa495ae53901799759c3.tar.gz src-585a5ed0bef4a0b874c8fa495ae53901799759c3.zip |
pfctl: fix recrusive printing of anchors
Fix a couple of problems with printing of anchors, in particular recursive
printing, both of inline anchors and when requested explicitly with a '*'
in the anchor.
- Correct recursive printing of wildcard anchors (recurse into child anchors
rather than rules, which don't exist)
- Print multi-part anchor paths correctly (pr6065)
- Fix comments and prevent users from specifying multi-component names for
inline anchors.
tested by phessler
ok henning
Also fix the relevant pfctl test case to reflect the new (and now
correct) behaviour).
MFC after: 3 weeks
Obtained from: OpenBSD (mcbride, f9a568a27c740528301ca3419316c85a9fc7f1de)
Sponsored by: Rubicon Communications, LLC ("Netgate")
Differential Revision: https://reviews.freebsd.org/D36416
Diffstat (limited to 'sbin/pfctl/parse.y')
-rw-r--r-- | sbin/pfctl/parse.y | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/sbin/pfctl/parse.y b/sbin/pfctl/parse.y index 7bb6223319c4..5d0320e909fb 100644 --- a/sbin/pfctl/parse.y +++ b/sbin/pfctl/parse.y @@ -891,7 +891,12 @@ pfa_anchor : '{' pf->asd++; pf->bn++; - /* create a holding ruleset in the root */ + /* + * Anchor contents are parsed before the anchor rule + * production completes, so we don't know the real + * location yet. Create a holding ruleset in the root; + * contents will be moved afterwards. + */ snprintf(ta, PF_ANCHOR_NAME_SIZE, "_%d", pf->bn); rs = pf_find_or_create_ruleset(ta); if (rs == NULL) @@ -928,7 +933,14 @@ anchorrule : ANCHOR anchorname dir quick interface af proto fromto memset(&r, 0, sizeof(r)); if (pf->astack[pf->asd + 1]) { - /* move inline rules into relative location */ + if ($2 && strchr($2, '/') != NULL) { + free($2); + yyerror("anchor paths containing '/' " + "cannot be used for inline anchors."); + YYERROR; + } + + /* Move inline rules into relative location. */ pfctl_anchor_setup(&r, &pf->astack[pf->asd]->ruleset, $2 ? $2 : pf->alast->name); |