authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-05-25 20:34:44-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-05-25 20:34:44-07:00
log1d750d7067e6e24af00aadc19379cd913652d80e
tree568890d0ff846734519e712c3ee0405991bec70e
parent5b022623cf7059b76d3bbc91c71a93ab96adbdeb

Maker.Step.Run: fix leak in evalGeneric


1 files changed, 3 insertions(+), 6 deletions(-)

lib/compiler/Maker/Step/Run.zig+3-6
...@@ -1374,6 +1374,7 @@ fn sendRunFuzzTestMessage(...@@ -1374,6 +1374,7 @@ fn sendRunFuzzTestMessage(
1374 }1374 }
1375}1375}
13761376
1377/// Uses `arena` to allocate the result.
1377fn evalGeneric(1378fn evalGeneric(
1378 arena: Allocator,1379 arena: Allocator,
1379 run_index: Configuration.Step.Index,1380 run_index: Configuration.Step.Index,
...@@ -1382,7 +1383,6 @@ fn evalGeneric(...@@ -1382,7 +1383,6 @@ fn evalGeneric(
1382) !EvalGenericResult {1383) !EvalGenericResult {
1383 const graph = maker.graph;1384 const graph = maker.graph;
1384 const io = graph.io;1385 const io = graph.io;
1385 const gpa = maker.gpa;
1386 const conf = &maker.scanned_config.configuration;1386 const conf = &maker.scanned_config.configuration;
1387 const conf_step = run_index.ptr(conf);1387 const conf_step = run_index.ptr(conf);
1388 const conf_run = conf_step.extended.get(conf.extra).run;1388 const conf_run = conf_step.extended.get(conf.extra).run;
...@@ -1436,8 +1436,7 @@ fn evalGeneric(...@@ -1436,8 +1436,7 @@ fn evalGeneric(
1436 if (child.stderr) |stderr| {1436 if (child.stderr) |stderr| {
1437 var multi_reader_buffer: Io.File.MultiReader.Buffer(2) = undefined;1437 var multi_reader_buffer: Io.File.MultiReader.Buffer(2) = undefined;
1438 var multi_reader: Io.File.MultiReader = undefined;1438 var multi_reader: Io.File.MultiReader = undefined;
1439 multi_reader.init(gpa, io, multi_reader_buffer.toStreams(), &.{ stdout, stderr });1439 multi_reader.init(arena, io, multi_reader_buffer.toStreams(), &.{ stdout, stderr });
1440 defer multi_reader.deinit();
14411440
1442 const stdout_reader = multi_reader.reader(0);1441 const stdout_reader = multi_reader.reader(0);
1443 const stderr_reader = multi_reader.reader(1);1442 const stderr_reader = multi_reader.reader(1);
...@@ -1457,9 +1456,7 @@ fn evalGeneric(...@@ -1457,9 +1456,7 @@ fn evalGeneric(
14571456
1458 try multi_reader.checkAnyError();1457 try multi_reader.checkAnyError();
14591458
1460 // TODO: this string can leak since alloc below can return error.
1461 stdout_bytes = try multi_reader.toOwnedSlice(0);1459 stdout_bytes = try multi_reader.toOwnedSlice(0);
1462 // TODO: this string can leak since its allocated using gpa and `try child.wait(io)` below can fail.
1463 stderr_bytes = try multi_reader.toOwnedSlice(1);1460 stderr_bytes = try multi_reader.toOwnedSlice(1);
1464 } else {1461 } else {
1465 var stdout_reader = stdout.readerStreaming(io, &.{});1462 var stdout_reader = stdout.readerStreaming(io, &.{});
...@@ -2201,7 +2198,7 @@ fn spawnChildAndCollect(...@@ -2201,7 +2198,7 @@ fn spawnChildAndCollect(
2201 try setColorEnvironmentVariables(&conf_run, environ_map, terminal_mode);2198 try setColorEnvironmentVariables(&conf_run, environ_map, terminal_mode);
22022199
2203 const started: Io.Clock.Timestamp = .now(io, .awake);2200 const started: Io.Clock.Timestamp = .now(io, .awake);
2204 const result = evalGeneric(arena, run_index, maker, spawn_options) catch |err| switch (err) {2201 const result = evalGeneric(graph.arena, run_index, maker, spawn_options) catch |err| switch (err) {
2205 error.Canceled => |e| return e,2202 error.Canceled => |e| return e,
2206 else => |e| e,2203 else => |e| e,
2207 };2204 };