Skip to content

std.fs.wasi.preopensAlloc requires an arena, but it claims to want a gpa #22911

@squeek502

Description

@squeek502

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:

zig/lib/std/fs/wasi.zig

Lines 26 to 54 in ddff1fa

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behavioros-wasiWebAssembly System Interfacestandard libraryThis issue involves writing Zig code for the standard library.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions