diff options
author | 2008-03-12 17:41:38 +0000 | |
---|---|---|
committer | 2008-03-12 17:41:38 +0000 | |
commit | 8c2e6d0131646f716ce6f3efeae5972d5eeb96ed (patch) | |
tree | 52e006770f7f36986faece685d2a367b9593847a | |
parent | Include relay-sid in the response if one was received. (diff) | |
download | wireguard-openbsd-8c2e6d0131646f716ce6f3efeae5972d5eeb96ed.tar.xz wireguard-openbsd-8c2e6d0131646f716ce6f3efeae5972d5eeb96ed.zip |
fix a memleak in the ber_read_elements() error case.
ok claudio@
-rw-r--r-- | usr.sbin/snmpd/ber.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/usr.sbin/snmpd/ber.c b/usr.sbin/snmpd/ber.c index 7a573cfa9b5..2529c24f102 100644 --- a/usr.sbin/snmpd/ber.c +++ b/usr.sbin/snmpd/ber.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ber.c,v 1.9 2008/03/12 14:30:11 claudio Exp $ */ +/* $OpenBSD: ber.c,v 1.10 2008/03/12 17:41:38 reyk Exp $ */ /* * Copyright (c) 2007 Reyk Floeter <reyk@vantronix.net> @@ -735,8 +735,10 @@ ber_write_elements(struct ber *ber, struct ber_element *root) * NULL, type mismatch or read error */ struct ber_element * -ber_read_elements(struct ber *ber, struct ber_element *root) +ber_read_elements(struct ber *ber, struct ber_element *elm) { + struct ber_element *root = elm; + if (root == NULL) { if ((root = ber_get_element(0)) == NULL) return NULL; @@ -744,8 +746,12 @@ ber_read_elements(struct ber *ber, struct ber_element *root) DPRINTF("read ber elements, root %p\n", root); - if (ber_read_element(ber, root) == -1) + if (ber_read_element(ber, root) == -1) { + /* Cleanup if root was allocated by us */ + if (elm == NULL) + ber_free_elements(root); return NULL; + } return root; } |