commit 9636d76b6d26d142f7d23e6d25eec1c28cf571b4 (tree)
parent 21914c7c01d8d1071034153451414719906167b8
Author: Meghan Denny <hello@nektro.net>
Date: Sat, 18 Apr 2026 07:34:32 +0200
std.os.linux: getdents accepts a c_uint length (#31825)
https://github.com/torvalds/linux/blob/e774d5f1bc27a85f858bce7688509e866f8e8a4e/include/linux/syscalls.h#L1100-L1102
https://github.com/torvalds/linux/blob/e774d5f1bc27a85f858bce7688509e866f8e8a4e/include/linux/syscalls.h#L477-L479
Reviewed-on: https://codeberg.org/ziglang/zig/pulls/31825
Reviewed-by: Andrew Kelley <andrew@ziglang.org>
Co-authored-by: Meghan Denny <hello@nektro.net>
Co-committed-by: Meghan Denny <hello@nektro.net>
Diffstat:
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig
@@ -5484,7 +5484,7 @@ fn dirReadLinux(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir
}
const syscall: Syscall = try .start();
const n = while (true) {
- const rc = linux.getdents64(dr.dir.handle, dr.buffer.ptr, dr.buffer.len);
+ const rc = linux.getdents64(dr.dir.handle, dr.buffer.ptr, @min(dr.buffer.len, std.math.maxInt(c_uint)));
switch (linux.errno(rc)) {
.SUCCESS => {
syscall.finish();
diff --git a/lib/std/Io/Uring.zig b/lib/std/Io/Uring.zig
@@ -3070,7 +3070,7 @@ fn dirRead(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir.Read
}
const n = while (true) {
try sync.cancel_region.await(.nothing);
- const rc = linux.getdents64(dr.dir.handle, dr.buffer.ptr, dr.buffer.len);
+ const rc = linux.getdents64(dr.dir.handle, dr.buffer.ptr, @min(dr.buffer.len, std.math.maxInt(c_uint)));
switch (linux.errno(rc)) {
.SUCCESS => break rc,
.INTR => {},
diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig
@@ -887,21 +887,21 @@ pub fn getcwd(buf: [*]u8, size: usize) usize {
return syscall2(.getcwd, @intFromPtr(buf), size);
}
-pub fn getdents(fd: fd_t, dirp: [*]u8, len: usize) usize {
+pub fn getdents(fd: fd_t, dirp: [*]u8, len: c_uint) usize {
return syscall3(
.getdents,
@as(u32, @bitCast(fd)),
@intFromPtr(dirp),
- @min(len, maxInt(c_int)),
+ len,
);
}
-pub fn getdents64(fd: fd_t, dirp: [*]u8, len: usize) usize {
+pub fn getdents64(fd: fd_t, dirp: [*]u8, len: c_uint) usize {
return syscall3(
.getdents64,
@as(u32, @bitCast(fd)),
@intFromPtr(dirp),
- @min(len, maxInt(c_int)),
+ len,
);
}