Zig Version
0.14.0-dev.3224+5ab511307
Steps to Reproduce and Observed Behavior
std.fs.wasi.preopensAlloc returns a names slice that is a mixture of string literals and heap-allocated strings:
|
pub fn preopensAlloc(gpa: Allocator) Allocator.Error!Preopens { |
|
var names: std.ArrayListUnmanaged([]const u8) = .empty; |
|
defer names.deinit(gpa); |
|
|
|
try names.ensureUnusedCapacity(gpa, 3); |
|
|
|
names.appendAssumeCapacity("stdin"); // 0 |
|
names.appendAssumeCapacity("stdout"); // 1 |
|
names.appendAssumeCapacity("stderr"); // 2 |
|
while (true) { |
|
const fd = @as(wasi.fd_t, @intCast(names.items.len)); |
|
var prestat: prestat_t = undefined; |
|
switch (wasi.fd_prestat_get(fd, &prestat)) { |
|
.SUCCESS => {}, |
|
.OPNOTSUPP, .BADF => return .{ .names = try names.toOwnedSlice(gpa) }, |
|
else => @panic("fd_prestat_get: unexpected error"), |
|
} |
|
try names.ensureUnusedCapacity(gpa, 1); |
|
// This length does not include a null byte. Let's keep it this way to |
|
// gently encourage WASI implementations to behave properly. |
|
const name_len = prestat.u.dir.pr_name_len; |
|
const name = try gpa.alloc(u8, name_len); |
|
errdefer gpa.free(name); |
|
switch (wasi.fd_prestat_dir_name(fd, name.ptr, name.len)) { |
|
.SUCCESS => {}, |
|
else => @panic("fd_prestat_dir_name: unexpected error"), |
|
} |
|
names.appendAssumeCapacity(name); |
|
} |
This means that there is no safe way to fully free the returned value (since freeing the string literals is illegal behavior), so an arena must be used in order to avoid leaking the heap-allocated slices. However, the Allocator parameter is erroneously named gpa.
Note: All existing usage sites of this function do use an arena when calling this function.
Expected Behavior
Should be updated to work with a gpa or documented to require an arena.
Zig Version
0.14.0-dev.3224+5ab511307
Steps to Reproduce and Observed Behavior
std.fs.wasi.preopensAllocreturns anamesslice that is a mixture of string literals and heap-allocated strings:zig/lib/std/fs/wasi.zig
Lines 26 to 54 in ddff1fa
This means that there is no safe way to fully free the returned value (since freeing the string literals is illegal behavior), so an arena must be used in order to avoid leaking the heap-allocated slices. However, the
Allocatorparameter is erroneously namedgpa.Note: All existing usage sites of this function do use an arena when calling this function.
Expected Behavior
Should be updated to work with a gpa or documented to require an arena.