The current API for adding rules with pool addresses is the following:
- DIOCADDADDR adds addresses and puts them into V_pf_pabuf - DIOCADDRULE takes all addresses from V_pf_pabuf and links them into rule. The ugly part is that if address is a table, then it is initialized in DIOCADDRULE, because we need ruleset, and DIOCADDADDR doesn't supply ruleset. But if address is a dynaddr, we need address family, and address family could be different for different addresses in one rule, so dynaddr is initialized in DIOCADDADDR. This leads to the entangled state of addresses on V_pf_pabuf. Some are initialized, and some not. That's why running pf_empty_pool(&V_pf_pabuf) can lead to a panic on a NULL table address. Since proper fix requires API/ABI change, for now simply plug the panic in pf_empty_pool(). Reported by: danger
This commit is contained in:
parent
28bc7834e0
commit
53f4b0cf9b
@ -343,7 +343,9 @@ pf_empty_pool(struct pf_palist *poola)
|
||||
pfi_dynaddr_remove(pa->addr.p.dyn);
|
||||
break;
|
||||
case PF_ADDR_TABLE:
|
||||
pfr_detach_table(pa->addr.p.tbl);
|
||||
/* XXX: this could be unfinished pooladdr on pabuf */
|
||||
if (pa->addr.p.tbl != NULL)
|
||||
pfr_detach_table(pa->addr.p.tbl);
|
||||
break;
|
||||
}
|
||||
if (pa->kif)
|
||||
|
Loading…
Reference in New Issue
Block a user