Hello Richard,
> > What has to be granted is there is one 'winner' only, which puts the
> > rule to garbage collector list. The pragmatic approach wins here.
>
> Right. I'll just note though that the patch as it stands allows multiple
> winners: consider the window between testing PFRULE_EXPIRED and setting it
> (quoted below). Multiple threads may execute in that window before one of
> them closes it by setting PFRULE_EXPIRED. Each of them will delete the
> same rule in turn, causing a probable crash. At least,
>
> SLIST_INSERT_HEAD(&pf_rule_gcl, r, gcle);
> SLIST_INSERT_HEAD(&pf_rule_gcl, r, gcle);
>
> crashes my machine.
>
> Whether that's a realistic issue, I don't know. I have though been bitten
> by enough edge cases like this to be very wary of them.
I think it's not realistic with current PF at OpenBSD. The pf_test() function
does not run concurrently, so there can be no such race.
FYI: PF@solaris uses mutex there to protect the insertion to gcl. Code goes as
follows at Solaris:
if (!(r->rule_flags & PFRULE_EXPIRED)) {
mutex_enter(&gcl_mutex);
/* retest under exclusive protection */
if (!(r->rule_flags & PFRULE_EXPIRED)) {
r->rule_flag |= PFRULE_EXPIRED;
SLIST_INSERT_HEAD(&pf_rule_gcl, r, gcle);
}
}
regards
sasha