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;