aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristof Provost <kp@FreeBSD.org>2021-05-27 09:43:17 +0000
committerKristof Provost <kp@FreeBSD.org>2021-06-03 06:36:54 +0000
commit2e7cd5ec7e6217355a27754fd53b0645f7fe4e9d (patch)
tree8eade70475927ab96a77aa51e29f6e9235cbf693
parenta75154a11586361c2564b020819e6f7971cf4e1f (diff)
downloadsrc-2e7cd5ec7e6217355a27754fd53b0645f7fe4e9d.tar.gz
src-2e7cd5ec7e6217355a27754fd53b0645f7fe4e9d.zip
libpfctl: Improve error handling in pfctl_get_states()
Ensure that we always free nvlists and other allocated memory. Reviewed by: scottl MFC after: 3 days Sponsored by: Rubicon Communications, LLC ("Netgate") Differential Revision: https://reviews.freebsd.org/D30493 (cherry picked from commit 27c77f42ae7402c313deec47aa67a8a8e0889410)
-rw-r--r--lib/libpfctl/libpfctl.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/lib/libpfctl/libpfctl.c b/lib/libpfctl/libpfctl.c
index ebc026800a1b..52cd0ed7f36c 100644
--- a/lib/libpfctl/libpfctl.c
+++ b/lib/libpfctl/libpfctl.c
@@ -731,9 +731,10 @@ int
pfctl_get_states(int dev, struct pfctl_states *states)
{
struct pfioc_nv nv;
- nvlist_t *nvl;
+ nvlist_t *nvl = NULL;
const nvlist_t * const *slist;
size_t found_count;
+ int error = 0;
bzero(states, sizeof(*states));
TAILQ_INIT(&states->states);
@@ -744,14 +745,14 @@ pfctl_get_states(int dev, struct pfctl_states *states)
for (;;) {
if (ioctl(dev, DIOCGETSTATESNV, &nv)) {
- free(nv.data);
- return (errno);
+ error = errno;
+ goto out;
}
nvl = nvlist_unpack(nv.data, nv.len, 0);
if (nvl == NULL) {
- free(nv.data);
- return (EIO);
+ error = EIO;
+ goto out;
}
states->count = nvlist_get_number(nvl, "count");
@@ -776,8 +777,10 @@ pfctl_get_states(int dev, struct pfctl_states *states)
nv.data = realloc(nv.data, new_size);
nv.size = new_size;
- if (nv.data == NULL)
- return (ENOMEM);
+ if (nv.data == NULL) {
+ error = ENOMEM;
+ goto out;
+ }
continue;
}
@@ -785,9 +788,8 @@ pfctl_get_states(int dev, struct pfctl_states *states)
struct pfctl_state *s = malloc(sizeof(*s));
if (s == NULL) {
pfctl_free_states(states);
- nvlist_destroy(nvl);
- free(nv.data);
- return (ENOMEM);
+ error = ENOMEM;
+ goto out;
}
pf_nvstate_to_state(slist[i], s);
@@ -796,7 +798,11 @@ pfctl_get_states(int dev, struct pfctl_states *states)
break;
}
- return (0);
+out:
+ nvlist_destroy(nvl);
+ free(nv.data);
+
+ return (error);
}
void