summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org </C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org>2006-05-23 08:45:25 +0000
committer/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org </C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org>2006-05-23 08:45:25 +0000
commitbf8b9dfa16409f7f0b740bccf7bce0724db5d27d (patch)
treef7976cd166209fc47faa36f99d9f2aa2fd47b72a
parent9fb3c994a682d21aecde12377f32d81f2d11e382 (diff)
Fix a minor memory leak for stack config statements (Philip Craig)
-rw-r--r--src/ulogd.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/src/ulogd.c b/src/ulogd.c
index 2dc597b..4097983 100644
--- a/src/ulogd.c
+++ b/src/ulogd.c
@@ -609,12 +609,15 @@ static int create_stack(const char *option)
if (!buf) {
ulogd_log(ULOGD_ERROR, "");
- return 1;
+ ret = -ENOMEM;
+ goto out_buf;
}
stack = malloc(sizeof(*stack));
- if (!stack)
- return -ENOMEM;
+ if (!stack) {
+ ret = -ENOMEM;
+ goto out_stack;
+ }
INIT_LLIST_HEAD(&stack->list);
ulogd_log(ULOGD_DEBUG, "building new pluginstance stack (%s):\n",
@@ -634,8 +637,8 @@ static int create_stack(const char *option)
if (!equals || (equals - tok >= ULOGD_MAX_KEYLEN)) {
ulogd_log(ULOGD_ERROR, "syntax error while parsing `%s'"
"of line `%s'\n", tok, buf);
- free(stack);
- return -EINVAL;
+ ret = -EINVAL;
+ goto out;
}
strncpy(pi_id, tok, ULOGD_MAX_KEYLEN-1);
pi_id[equals-tok] = '\0';
@@ -646,8 +649,8 @@ static int create_stack(const char *option)
if (!pl) {
ulogd_log(ULOGD_ERROR, "can't find requested plugin "
"%s\n", plname);
- free(stack);
- return -ENODEV;
+ ret = -ENODEV;
+ goto out;
}
/* allocate */
@@ -656,8 +659,8 @@ static int create_stack(const char *option)
ulogd_log(ULOGD_ERROR,
"unable to allocate pluginstance for %s\n",
pi_id);
- free(stack);
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto out;
}
/* FIXME: call constructor routine from end to beginning,
@@ -671,21 +674,27 @@ static int create_stack(const char *option)
ret = create_stack_resolve_keys(stack);
if (ret < 0) {
ulogd_log(ULOGD_DEBUG, "destroying stack\n");
- free(stack);
- return ret;
+ goto out;
}
/* PASS 3: start each plugin in stack */
ret = create_stack_start_instances(stack);
if (ret < 0) {
ulogd_log(ULOGD_DEBUG, "destroying stack\n");
- free(stack);
- return ret;
+ goto out;
}
/* add head of pluginstance stack to list of stacks */
llist_add(&stack->stack_list, &ulogd_pi_stacks);
+ free(buf);
return 0;
+
+out:
+ free(stack);
+out_stack:
+ free(buf);
+out_buf:
+ return ret;
}