aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-11-16 11:31:11 +0100
committerFederico Angelilli <code@fedang.net>2024-11-16 11:31:11 +0100
commite07263e6f1c777241f9512fbbb266e89d1364f08 (patch)
treeedac777ae5dd7e1daa5e1349247d9ed3391b6482 /src
parent43fb3ac0b3f25cf1cc8aa0624b883ad372a5da95 (diff)
Fix memory leak
Diffstat (limited to 'src')
-rw-r--r--src/config.c13
-rw-r--r--src/util.c11
-rw-r--r--src/util.h2
3 files changed, 23 insertions, 3 deletions
diff --git a/src/config.c b/src/config.c
index c9543b7..3f7da08 100644
--- a/src/config.c
+++ b/src/config.c
@@ -223,11 +223,13 @@ static bool config_read_list(const char *value, char ***result)
*end = '\0';
if (!config_read_string(token, &list[n++])) {
+ free(copy);
free(list);
return false;
}
}
+ free(copy);
list[n] = NULL;
*result = list;
return true;
@@ -568,24 +570,29 @@ bool config_resolve_children(config_t *config, block_t *block)
if (!strcmp(children[i], config->blocks[j]->label)) {
if (config->blocks[j]->resolved) {
log_error("Block '%s' can only be referenced by one block", config->blocks[j]->label);
- return false;
+ goto error;
}
log_debug("Block '%s' is parent of '%s'", block->label, config->blocks[j]->label);
group->children[i] = config->blocks[j];
if (!config_resolve_children(config, config->blocks[j]))
- return false;
+ goto error;
goto next;
}
}
log_error("Block '%s' not found", children[i]);
- return false;
+ goto error;
next:
}
+ strfree(children);
return true;
+
+error:
+ strfree(children);
+ return false;
}
block_t *config_resolve(config_t *config)
diff --git a/src/util.c b/src/util.c
index 669e031..ac178cc 100644
--- a/src/util.c
+++ b/src/util.c
@@ -205,3 +205,14 @@ next:
buffer[n] = '\0';
return buffer;
}
+
+void strfree(char **list)
+{
+ if (list == NULL)
+ return;
+
+ for (char **head = list; *head != NULL; head++)
+ free(*head);
+
+ free(list);
+}
diff --git a/src/util.h b/src/util.h
index d7eafb5..a45ae4d 100644
--- a/src/util.h
+++ b/src/util.h
@@ -69,4 +69,6 @@ size_t strprefix(const char *string, const char *prefix);
char *strformat(const char *string, char delim, const char *keys[], const char *values[]);
+void strfree(char **list);
+
#endif