From 50e116275ce1e23902be86818394e9466a5b588e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Motiejus=20Jak=C5=A1tys?= Date: Thu, 7 Jul 2022 07:00:13 +0300 Subject: [PATCH] group names are sentinel-terminated --- src/DB.zig | 4 ++-- src/Group.zig | 7 ++----- src/libnss.zig | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/DB.zig b/src/DB.zig index d632101..a939eec 100644 --- a/src/DB.zig +++ b/src/DB.zig @@ -315,7 +315,7 @@ fn getGroup(self: *const DB, group: PackedGroup, buf: []u8) error{BufferTooSmall return CGroup{ .gid = group.gid(), - .name = buf[buf_offset .. buf_offset + name.len].ptr, + .name = buf[buf_offset .. buf_offset + name.len :0].ptr, .members = member_ptrs.ptr, }; } @@ -347,7 +347,7 @@ fn pushStr(str: []const u8, buf: []u8, offset: *usize) [*:0]const u8 { mem.copy(u8, buf[start..], str); buf[start + str.len] = 0; offset.* += str.len + 1; - return @ptrCast([*:0]const u8, &buf[start]); + return buf[start .. start + str.len :0].ptr; } fn getUser(self: *const DB, user: PackedUser, buf: []u8) error{BufferTooSmall}!CUser { diff --git a/src/Group.zig b/src/Group.zig index 8a4ceac..a2b5929 100644 --- a/src/Group.zig +++ b/src/Group.zig @@ -128,14 +128,11 @@ pub fn strlenZ(self: *const Group) usize { return count; } -// Name type should be 0-terminated, members should be null-terminated, but -// sentinel is not part of the type (but is always there). Adding sentinel -// crashes zig compiler in pre-0.10. https://github.com/ziglang/zig/issues/7517 pub const CGroup = extern struct { gid: u32, - // should be [*:0]const u8 - name: [*]const u8, + name: [*:0]const u8, // Should be [*:null]align(1) const ?[*:0]const u8 + // https://github.com/ziglang/zig/issues/7517 members: [*]align(1) const ?[*:0]const u8, }; diff --git a/src/libnss.zig b/src/libnss.zig index e560fdf..e9e6487 100644 --- a/src/libnss.zig +++ b/src/libnss.zig @@ -275,10 +275,27 @@ test "getgrgid_r and getgrnam_r" { ); try testing.expectEqual(@as(c_int, 0), errno); try testVidmantasGroup(group); + + group = undefined; + try testing.expectEqual( + c.NSS_STATUS_SUCCESS, + _nss_turbo_getgrnam_r("vidmantas", &group, &buffer, buffer.len, &errno), + ); + try testing.expectEqual(@as(c_int, 0), errno); + try testVidmantasGroup(group); + + group = undefined; + try testing.expectEqual( + c.NSS_STATUS_NOTFOUND, + _nss_turbo_getgrnam_r("does not exist", &group, &buffer, buffer.len, &errno), + ); + try testing.expectEqual(@enumToInt(os.E.NOENT), @intCast(u16, errno)); } fn testVidmantasGroup(g: CGroup) !void { try testing.expectEqual(@as(u32, 128), g.gid); + try testing.expectEqualStrings("vidmantas", mem.sliceTo(g.name, 0)); const members = g.members; try testing.expect(members[0] != null); + try testing.expectEqualStrings("vidmantas", mem.sliceTo(members[0].?, 0)); }