Skip to content

Commit

Permalink
pf: fix DIOCCHANGERULE after pf config and rb tree of rules
Browse files Browse the repository at this point in the history
Reviewed by:	kp
Sponsored by:	Rubicon Communications, LLC ("Netgate")

(cherry picked from commit ff80dd0)
  • Loading branch information
mjguzik authored and Mateusz Guzik committed May 24, 2022
1 parent ebb5040 commit 635f65a
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions sys/netpfil/pf/pf_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -3407,6 +3407,7 @@ pfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *td

#define ERROUT(x) ERROUT_IOCTL(DIOCCHANGERULE_error, x)

PF_CONFIG_LOCK();
PF_RULES_WLOCK();
#ifdef PF_WANT_32_TO_64_COUNTER
if (newrule != NULL) {
Expand Down Expand Up @@ -3515,6 +3516,7 @@ pfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *td
if (error) {
pf_free_rule(newrule);
PF_RULES_WUNLOCK();
PF_CONFIG_UNLOCK();
break;
}

Expand All @@ -3537,6 +3539,7 @@ pfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *td
if (newrule != NULL)
pf_free_rule(newrule);
PF_RULES_WUNLOCK();
PF_CONFIG_UNLOCK();
error = EINVAL;
break;
}
Expand All @@ -3545,8 +3548,20 @@ pfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *td
if (pcr->action == PF_CHANGE_REMOVE) {
pf_unlink_rule(ruleset->rules[rs_num].active.ptr,
oldrule);
RB_REMOVE(pf_krule_global,
ruleset->rules[rs_num].active.tree, oldrule);
ruleset->rules[rs_num].active.rcount--;
} else {
pf_hash_rule(newrule);
if (RB_INSERT(pf_krule_global,
ruleset->rules[rs_num].active.tree, newrule) != NULL) {
pf_free_rule(newrule);
PF_RULES_WUNLOCK();
PF_CONFIG_UNLOCK();
error = EEXIST;
break;
}

if (oldrule == NULL)
TAILQ_INSERT_TAIL(
ruleset->rules[rs_num].active.ptr,
Expand All @@ -3572,6 +3587,7 @@ pfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *td
pf_remove_if_empty_kruleset(ruleset);

PF_RULES_WUNLOCK();
PF_CONFIG_UNLOCK();
break;

#undef ERROUT
Expand Down

0 comments on commit 635f65a

Please sign in to comment.