Commit 213390b

Cyrus Najmabadi  ·  2026-10-22 22:42:01 -0400 EDT
parent 7f0ffdb
Fix double free when a tracked environment variable is missing (#301)
1 files changed,  +3, -5
+3, -5
jump to top
......@@ -855,9 +855,10 @@ pub fn printEnv(alloc: Allocator, io: Io, name: []const u8, key: ?[]const u8) ![
855855 defer alloc.free(socket_path);
856856
857857 const payload = try ipc.roundTripForTag(alloc, socket_path, .EnvGet, "", .EnvData);
858- errdefer alloc.free(payload);
859858
859+ // A whole-environment query gives this buffer to the caller.
860860 if (key == null) return payload;
861+ defer alloc.free(payload);
861862
862863 // Search for key in payload: lines formatted as "KEY=VALUE\n"
863864 var lines = std.mem.splitScalar(u8, payload, '\n');
......@@ -865,12 +866,9 @@ pub fn printEnv(alloc: Allocator, io: Io, name: []const u8, key: ?[]const u8) ![
865866 if (std.mem.startsWith(u8, line, key.?)) {
866867 if (line.len > key.?.len and line[key.?.len] == '=') {
867868 const val = line[key.?.len + 1 ..];
868- const result = try alloc.dupe(u8, val);
869- alloc.free(payload);
870- return result;
869+ return try alloc.dupe(u8, val);
871870 }
872871 }
873872 }
874- alloc.free(payload);
875873 return error.EnvVarNotFound;
876874 }