diff --git a/lib/Group.zig b/lib/Group.zig index 40c161c..bdf6326 100644 --- a/lib/Group.zig +++ b/lib/Group.zig @@ -7,18 +7,23 @@ const Group = @This(); gid: u32, name: [:0]const u8, -// -members: [:null]const ?[:0]const u8, +// should be [:null]const ?[:0]const u8, but it crashes the compiler. See +// https://github.com/ziglang/zig/issues/7517. +// members[members.len] is always null for cloned groups. Once the bug +// in the compiler is fixed, we should update the return type here. +members: []const ?[:0]const u8, pub fn clone(self: *const Group, allocator: Allocator) Allocator.Error!Group { - var members = try allocator.allocSentinel(?[:0]const u8, self.members.len, null); + var members = try allocator.alloc(?[:0]const u8, self.members.len + 1); errdefer allocator.free(members); - members.len = self.members.len; + members.len = self.members.len + 1; for (self.members) |member, i| { - const member_name = member.?; - members[i] = try allocator.dupeZ(u8, member_name); + members[i] = try allocator.dupeZ(u8, member.?); + errdefer allocator.free(members[i]); } + members[self.members.len] = null; + members.len = self.members.len; return Group{ .gid = self.gid, @@ -46,7 +51,7 @@ test "Group.clone" { var group = Group{ .gid = 1, .name = "foo", - .members = &[_:null]?[:0]const u8{ member1, "member2", null }, + .members = &[_:null]?[:0]const u8{ member1, "member2" }, }; var cloned = try group.clone(testing.allocator);