group names are sentinel-terminated
This commit is contained in:
parent
5f49a9f881
commit
50e116275c
@ -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 {
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user