From d731fe377b52cecbff3566bb416737aaa125eb31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Motiejus=20Jak=C5=A1tys?= Date: Thu, 14 Jul 2022 06:30:45 +0300 Subject: [PATCH] skip membership if already in the primary group --- src/Corpus.zig | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Corpus.zig b/src/Corpus.zig index d3e7705..42164fd 100644 --- a/src/Corpus.zig +++ b/src/Corpus.zig @@ -167,6 +167,11 @@ pub fn init( for (groupmembers) |member_name| { if (name2user.get(member_name)) |user_idx| { + + // if user is in a group of their primary gid, + // skip the membersip. + if (users.items(.gid)[user_idx] == groups.items(.gid)[i]) + continue; members.len += 1; members[members.len - 1] = user_idx; try user2groups[user_idx].append(allocator, @intCast(u32, i)); @@ -258,7 +263,10 @@ pub fn testCorpus(allocator: Allocator) !Corpus { .shell = "/usr/sbin/nologin", } }; - var group0 = try Group.init(allocator, 0, "root", &[_][]const u8{}); + // the "root" membership should be removed, because root's gid is this + // group's id. All the exported functions that return memberships (getgr*, + // initgroups_dyn) expect these users will not be returned. + var group0 = try Group.init(allocator, 0, "root", &[_][]const u8{"root"}); var group1 = try Group.init(allocator, 128, "vidmantas", &[_][]const u8{}); var group2 = try Group.init( allocator,