summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreyk <reyk@openbsd.org>2008-03-12 17:41:38 +0000
committerreyk <reyk@openbsd.org>2008-03-12 17:41:38 +0000
commit8c2e6d0131646f716ce6f3efeae5972d5eeb96ed (patch)
tree52e006770f7f36986faece685d2a367b9593847a
parentInclude relay-sid in the response if one was received. (diff)
downloadwireguard-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.c12
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;
}