commit 56bb02d
shrub
·
2026-04-28 16:18:14 +0000 UTC
parent 5c285d7
make assign realloc safe and free fullpath on failiure in main.c : use arenas for submake stack
3 files changed,
+22,
-5
+14,
-2
1@@ -245,6 +245,7 @@ main(int argc, char **argv)
2 if (i + 1 >= argc) {
3 fprintf(stderr, "specify a generator\n\n");
4 usage(stderr, argv[0]);
5+ free(assigns);
6 return 2;
7 }
8 ++i;
9@@ -257,27 +258,32 @@ main(int argc, char **argv)
10 } else {
11 fprintf(stderr, "unknown generator: %s\n\n", argv[i]);
12 usage(stderr, argv[0]);
13+ free(assigns);
14 return 2;
15 }
16 } else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) {
17 usage(stdout, argv[0]);
18+ free(assigns);
19 return 0;
20 } else if (strcmp(argv[i], "-C") == 0) {
21 if (i + 1 >= argc) {
22 fprintf(stderr, "specify a directory\n\n");
23 usage(stderr, argv[0]);
24+ free(assigns);
25 return 2;
26 }
27 ++i;
28
29 if (chdir(argv[i]) != 0) {
30 fprintf(stderr, "failed to chdir to %s", argv[i]);
31+ free(assigns);
32 return 2;
33 }
34 } else if (strcmp(argv[i], "-f") == 0) {
35 if (i + 1 >= argc) {
36 fprintf(stderr, "specify a file\n\n");
37 usage(stderr, argv[0]);
38+ free(assigns);
39 return 2;
40 }
41 ++i;
42@@ -285,17 +291,23 @@ main(int argc, char **argv)
43 } else if (strcmp(argv[i], "-e") == 0) {
44 env_override = 1;
45 } else if (isvarassign(argv[i])) {
46- assigns = realloc(assigns, (nassigns + 1) * sizeof(assigns[0]));
47- if (!assigns) {
48+ char **tmp;
49+
50+ tmp = realloc(assigns, (nassigns + 1) * sizeof(assigns[0]));
51+ if (!tmp) {
52 fprintf(stderr, "out of memory\n");
53+ free(assigns);
54 return 2;
55 }
56+ assigns = tmp;
57 assigns[nassigns++] = argv[i];
58 } else if (argv[i][0] == '-') {
59 usage(stderr, argv[0]);
60+ free(assigns);
61 return 2;
62 } else {
63 usage(stderr, argv[0]);
64+ free(assigns);
65 return 2;
66 }
67 }
+5,
-2
1@@ -8,6 +8,7 @@
2 struct SubGraphStack {
3 char **v;
4 size_t n;
5+ struct Arena arena;
6 };
7
8 static int
9@@ -122,7 +123,7 @@ static void
10 pushstack(struct SubGraphStack *stack, const char *key)
11 {
12 stack->v = xrealloc(stack->v, (stack->n + 1) * sizeof(stack->v[0]));
13- stack->v[stack->n++] = xstrdup(key);
14+ stack->v[stack->n++] = arena_strdup(&stack->arena, key);
15 }
16
17 static void
18@@ -130,7 +131,6 @@ popstack(struct SubGraphStack *stack)
19 {
20 if (!stack->n)
21 return;
22- free(stack->v[stack->n - 1]);
23 stack->n--;
24 }
25
26@@ -585,15 +585,18 @@ buildsubgraph(struct SubGraph *sg)
27 int rc;
28
29 memset(&stack, 0, sizeof(stack));
30+ arena_init(&stack.arena, 0);
31 if (!sg->cwd)
32 sg->cwd = getcwddup();
33 rc = buildsubgraph0(sg, &stack);
34 if (rc < 0) {
35 while (stack.n)
36 popstack(&stack);
37+ arena_free(&stack.arena);
38 free(stack.v);
39 return rc;
40 }
41+ arena_free(&stack.arena);
42 free(stack.v);
43 return 0;
44 }
+3,
-1
1@@ -255,8 +255,10 @@ loadmakefile(const char *path, char **path_out, char **src_out)
2 break;
3 }
4 }
5- if (!src)
6+ if (!src) {
7+ free(fullpath);
8 return -1;
9+ }
10 *path_out = fullpath;
11 *src_out = src;
12 return 0;