From 9636d76b6d26d142f7d23e6d25eec1c28cf571b4 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Sat, 18 Apr 2026 07:34:32 +0200 Subject: [PATCH] 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 Co-authored-by: Meghan Denny Co-committed-by: Meghan Denny --- lib/std/Io/Threaded.zig | 2 +- lib/std/Io/Uring.zig | 2 +- lib/std/os/linux.zig | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index 92a0201aa6..3246ba38b1 100644 --- 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 index 750465c493..114d6ec972 100644 --- 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 index 8a3d1a3b76..79e65220a0 100644 --- 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, ); }