zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 186e8058381747b589190898560dcfa5622facc7 (tree)
parent faf2fd18d33de246c5bb03905f25290108e1dd30
Author: Isaac Freund <mail@isaacfreund.com>
Date:   Mon, 23 Jan 2023 12:17:06 +0100

std.net.Address: clarify unix socket getOsSockLen

Diffstat:
Mlib/std/net.zig | 18+++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/lib/std/net.zig b/lib/std/net.zig @@ -103,10 +103,10 @@ pub const Address = extern union { .path = undefined, }; - // this enables us to have the proper length of the socket in getOsSockLen - mem.set(u8, &sock_addr.path, 0); + // Add 1 to ensure a terminating 0 is present in the path array for maximum portability. + if (path.len + 1 > sock_addr.path.len) return error.NameTooLong; - if (path.len > sock_addr.path.len) return error.NameTooLong; + mem.set(u8, &sock_addr.path, 0); mem.copy(u8, &sock_addr.path, path); return Address{ .un = sock_addr }; @@ -179,9 +179,17 @@ pub const Address = extern union { unreachable; } - const path_len = std.mem.len(std.meta.assumeSentinel(&self.un.path, 0)); - return @intCast(os.socklen_t, @sizeOf(os.sockaddr.un) - self.un.path.len + path_len); + // Using the full length of the structure here is more portable than returning + // the number of bytes actually used by the currently stored path. + // This also is correct regardless if we are passing a socket address to the kernel + // (e.g. in bind, connect, sendto) since we ensure the path is 0 terminated in + // initUnix() or if we are receiving a socket address from the kernel and must + // provide the full buffer size (e.g. getsockname, getpeername, recvfrom, accept). + // + // To access the path, std.mem.sliceTo(&address.un.path, 0) should be used. + return @intCast(os.socklen_t, @sizeOf(os.sockaddr.un)); }, + else => unreachable, } }