diff options
author | piso <piso@FreeBSD.org> | 2008-03-03 22:32:01 +0000 |
---|---|---|
committer | piso <piso@FreeBSD.org> | 2008-03-03 22:32:01 +0000 |
commit | ad88c2c6c91b1a92f252cf48b54384cb6755dcd5 (patch) | |
tree | 5607ce7d3838dceb01f976a4c77288228dd169da | |
parent | 7da8e5ed4f261fc463861bc5bce6d53f73b24ee7 (diff) | |
download | FreeBSD-src-ad88c2c6c91b1a92f252cf48b54384cb6755dcd5.zip FreeBSD-src-ad88c2c6c91b1a92f252cf48b54384cb6755dcd5.tar.gz |
When unloading kld, don't forget to flush the nat pointers.
-rw-r--r-- | sys/netinet/ip_fw_nat.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/netinet/ip_fw_nat.c b/sys/netinet/ip_fw_nat.c index 488fd86..bac0d41 100644 --- a/sys/netinet/ip_fw_nat.c +++ b/sys/netinet/ip_fw_nat.c @@ -598,6 +598,7 @@ ipfw_nat_init(void) static void ipfw_nat_destroy(void) { + struct ip_fw *rule; struct cfg_nat *ptr, *ptr_temp; IPFW_WLOCK(&layer3_chain); @@ -608,6 +609,12 @@ ipfw_nat_destroy(void) free(ptr, M_IPFW); } EVENTHANDLER_DEREGISTER(ifaddr_event, ifaddr_event_tag); + /* flush all nat ptrs */ + for (rule = layer3_chain.rules; rule; rule = rule->next) { + ipfw_insn_nat *cmd = (ipfw_insn_nat *)ACTION_PTR(rule); + if (cmd->o.opcode == O_NAT) + cmd->nat = NULL; + } /* deregister ipfw_nat */ ipfw_nat_ptr = NULL; IPFW_WUNLOCK(&layer3_chain); |