mirror of https://gerrit.osmocom.org/libosmocore
osmo-config-merge: Fix some small issues
Allocate NULL context after exit_usage() calls and free it before exit so * sanitizer is happy. Also handle the error cases gracefully when a file is unreadable or formatted wrong. Change-Id: I966e63a3f7d0ff71ee0b88922aa3807d073aa232
This commit is contained in:
parent
f7aec792f7
commit
83c7134c7a
|
@ -44,6 +44,7 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <osmocom/core/linuxlist.h>
|
#include <osmocom/core/linuxlist.h>
|
||||||
#include <osmocom/core/talloc.h>
|
#include <osmocom/core/talloc.h>
|
||||||
|
@ -126,8 +127,11 @@ static struct node *file_read(void *ctx, const char *fname)
|
||||||
unsigned int line_num = 0;
|
unsigned int line_num = 0;
|
||||||
|
|
||||||
infile = fopen(fname, "r");
|
infile = fopen(fname, "r");
|
||||||
if (!infile)
|
if (!infile) {
|
||||||
|
fprintf(stderr, "Could not open file '%s': %s\n",
|
||||||
|
fname, strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
root = node_alloc(ctx);
|
root = node_alloc(ctx);
|
||||||
last = root;
|
last = root;
|
||||||
|
@ -140,7 +144,7 @@ static struct node *file_read(void *ctx, const char *fname)
|
||||||
if (indent > cur_indent+1) {
|
if (indent > cur_indent+1) {
|
||||||
fprintf(stderr, "File '%s' isn't well-formed in line %u, aborting!\n",
|
fprintf(stderr, "File '%s' isn't well-formed in line %u, aborting!\n",
|
||||||
fname, line_num);
|
fname, line_num);
|
||||||
exit(2);
|
return NULL;
|
||||||
}
|
}
|
||||||
/* new child to last node */
|
/* new child to last node */
|
||||||
n = node_alloc_child(last);
|
n = node_alloc_child(last);
|
||||||
|
@ -229,8 +233,7 @@ int main(int argc, char **argv)
|
||||||
const char *base_fname, *patch_fname;
|
const char *base_fname, *patch_fname;
|
||||||
struct node *base_tree, *patch_tree;
|
struct node *base_tree, *patch_tree;
|
||||||
bool debug_enabled = false;
|
bool debug_enabled = false;
|
||||||
|
void *ctx;
|
||||||
void *ctx = talloc_named_const(NULL, 0, "root");
|
|
||||||
|
|
||||||
if (argc < 3)
|
if (argc < 3)
|
||||||
exit_usage(1);
|
exit_usage(1);
|
||||||
|
@ -245,9 +248,16 @@ int main(int argc, char **argv)
|
||||||
exit_usage(1);
|
exit_usage(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx = talloc_named_const(NULL, 0, "root");
|
||||||
|
|
||||||
base_tree = file_read(ctx, base_fname);
|
base_tree = file_read(ctx, base_fname);
|
||||||
patch_tree = file_read(ctx, patch_fname);
|
patch_tree = file_read(ctx, patch_fname);
|
||||||
|
|
||||||
|
if (!base_tree || ! patch_tree) {
|
||||||
|
talloc_free(ctx);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
if (debug_enabled) {
|
if (debug_enabled) {
|
||||||
fprintf(stderr, "====== dumping tree (base)\n");
|
fprintf(stderr, "====== dumping tree (base)\n");
|
||||||
dump_node(base_tree, stderr, true);
|
dump_node(base_tree, stderr, true);
|
||||||
|
@ -265,6 +275,7 @@ int main(int argc, char **argv)
|
||||||
/* make AddressSanitizer / LeakSanitizer happy by recursively freeing the trees */
|
/* make AddressSanitizer / LeakSanitizer happy by recursively freeing the trees */
|
||||||
talloc_free(patch_tree);
|
talloc_free(patch_tree);
|
||||||
talloc_free(base_tree);
|
talloc_free(base_tree);
|
||||||
|
talloc_free(ctx);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue