fix: a leak in subprocess

This commit is contained in:
CJ van den Berg 2024-11-17 22:17:05 +01:00
parent 394b434169
commit 1691421a94
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -81,10 +81,10 @@ const Proc = struct {
const Receiver = tp.Receiver(*Proc); const Receiver = tp.Receiver(*Proc);
fn create(a: std.mem.Allocator, argv: tp.message, tag: [:0]const u8, stdin_behavior: std.process.Child.StdIo) !tp.pid { fn create(a: std.mem.Allocator, argv: tp.message, tag: [:0]const u8, stdin_behavior: std.process.Child.StdIo) !tp.pid {
const self: *Proc = try a.create(Proc);
var args = std.heap.ArenaAllocator.init(a); var args = std.heap.ArenaAllocator.init(a);
const args_a = args.allocator(); const args_a = args.allocator();
errdefer args.deinit();
var iter = argv.buf; var iter = argv.buf;
var len = cbor.decodeArrayHeader(&iter) catch return error.InvalidArgument; var len = cbor.decodeArrayHeader(&iter) catch return error.InvalidArgument;
var argv_ = try args_a.alloc([]const u8, len); var argv_ = try args_a.alloc([]const u8, len);
@ -102,6 +102,8 @@ const Proc = struct {
child.stdout_behavior = .Pipe; child.stdout_behavior = .Pipe;
child.stderr_behavior = .Pipe; child.stderr_behavior = .Pipe;
const self: *Proc = try a.create(Proc);
errdefer a.destroy(self);
self.* = .{ self.* = .{
.a = a, .a = a,
.receiver = Receiver.init(receive, self), .receiver = Receiver.init(receive, self),
@ -115,13 +117,14 @@ const Proc = struct {
} }
fn deinit(self: *Proc) void { fn deinit(self: *Proc) void {
self.args.deinit();
if (self.fd_stdin) |fd| fd.deinit(); if (self.fd_stdin) |fd| fd.deinit();
if (self.fd_stdout) |fd| fd.deinit(); if (self.fd_stdout) |fd| fd.deinit();
if (self.fd_stderr) |fd| fd.deinit(); if (self.fd_stderr) |fd| fd.deinit();
self.stdin_buffer.deinit(); self.stdin_buffer.deinit();
self.parent.deinit(); self.parent.deinit();
self.args.deinit();
self.a.free(self.tag); self.a.free(self.tag);
self.a.destroy(self);
} }
fn start(self: *Proc) tp.result { fn start(self: *Proc) tp.result {