summaryrefslogtreecommitdiffstats
path: root/sys/netpfil
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2014-03-11 15:19:11 +0000
committerglebius <glebius@FreeBSD.org>2014-03-11 15:19:11 +0000
commitc517ab4bf117902b6d104f25833233326c06978d (patch)
treeb01221f7b2bfa657b89e1b08da28b23a4e2f2418 /sys/netpfil
parent67ee44d8952678fe84c1bb7c055b796b60eb6931 (diff)
downloadFreeBSD-src-c517ab4bf117902b6d104f25833233326c06978d.zip
FreeBSD-src-c517ab4bf117902b6d104f25833233326c06978d.tar.gz
Merge r261028: fix resource leak and simplify code for DIOCCHANGEADDR.
Diffstat (limited to 'sys/netpfil')
-rw-r--r--sys/netpfil/pf/pf_ioctl.c42
1 files changed, 18 insertions, 24 deletions
diff --git a/sys/netpfil/pf/pf_ioctl.c b/sys/netpfil/pf/pf_ioctl.c
index c4506a6d..8fe8121 100644
--- a/sys/netpfil/pf/pf_ioctl.c
+++ b/sys/netpfil/pf/pf_ioctl.c
@@ -2277,6 +2277,7 @@ DIOCGETSTATES_full:
bcopy(&pca->addr, newpa, sizeof(struct pf_pooladdr));
if (newpa->ifname[0])
kif = malloc(sizeof(*kif), PFI_MTYPE, M_WAITOK);
+ newpa->kif = NULL;
}
#define ERROUT(x) { error = (x); goto DIOCCHANGEADDR_error; }
@@ -2294,8 +2295,8 @@ DIOCGETSTATES_full:
if (newpa->ifname[0]) {
newpa->kif = pfi_kif_attach(kif, newpa->ifname);
pfi_kif_ref(newpa->kif);
- } else
- newpa->kif = NULL;
+ kif = NULL;
+ }
switch (newpa->addr.type) {
case PF_ADDR_DYNIFTL:
@@ -2309,32 +2310,24 @@ DIOCGETSTATES_full:
error = ENOMEM;
break;
}
- if (error) {
- if (newpa->kif)
- pfi_kif_unref(newpa->kif);
- PF_RULES_WUNLOCK();
- free(newpa, M_PFRULE);
- break;
- }
+ if (error)
+ goto DIOCCHANGEADDR_error;
}
- if (pca->action == PF_CHANGE_ADD_HEAD)
+ switch (pca->action) {
+ case PF_CHANGE_ADD_HEAD:
oldpa = TAILQ_FIRST(&pool->list);
- else if (pca->action == PF_CHANGE_ADD_TAIL)
+ break;
+ case PF_CHANGE_ADD_TAIL:
oldpa = TAILQ_LAST(&pool->list, pf_palist);
- else {
- int i = 0;
-
+ break;
+ default:
oldpa = TAILQ_FIRST(&pool->list);
- while ((oldpa != NULL) && (i < pca->nr)) {
+ for (int i = 0; oldpa && i < pca->nr; i++)
oldpa = TAILQ_NEXT(oldpa, entries);
- i++;
- }
- if (oldpa == NULL) {
- PF_RULES_WUNLOCK();
- error = EINVAL;
- break;
- }
+
+ if (oldpa == NULL)
+ ERROUT(EINVAL);
}
if (pca->action == PF_CHANGE_REMOVE) {
@@ -2362,13 +2355,14 @@ DIOCGETSTATES_full:
}
pool->cur = TAILQ_FIRST(&pool->list);
- PF_ACPY(&pool->counter, &pool->cur->addr.v.a.addr,
- pca->af);
+ PF_ACPY(&pool->counter, &pool->cur->addr.v.a.addr, pca->af);
PF_RULES_WUNLOCK();
break;
#undef ERROUT
DIOCCHANGEADDR_error:
+ if (newpa->kif)
+ pfi_kif_unref(newpa->kif);
PF_RULES_WUNLOCK();
if (newpa != NULL)
free(newpa, M_PFRULE);
OpenPOWER on IntegriCloud