bring back additional_gids_offset
This commit is contained in:
19
src/user.zig
19
src/user.zig
@@ -6,16 +6,17 @@ const Allocator = std.mem.Allocator;
|
||||
const ArrayList = std.ArrayList;
|
||||
const cast = std.math.cast;
|
||||
|
||||
const PackedUserSize = @divExact(@bitSizeOf(PackedUser), 8);
|
||||
pub const PackedUser = packed struct {
|
||||
uid: u32,
|
||||
gid: u32,
|
||||
additional_gids_offset: u29,
|
||||
shell_here: bool,
|
||||
shell_len_or_idx: u6,
|
||||
home_len: u6,
|
||||
name_is_a_suffix: bool,
|
||||
name_len: u5,
|
||||
gecos_len: u10,
|
||||
padding: u3,
|
||||
gecos_len: u8,
|
||||
|
||||
// blobLength returns the length of the blob storing string values.
|
||||
pub fn blobLength(self: *const PackedUser) usize {
|
||||
@@ -107,7 +108,7 @@ pub const UserWriter = struct {
|
||||
const home_len = try downCast(u6, user.home.len - 1);
|
||||
const name_len = try downCast(u5, user.name.len - 1);
|
||||
const shell_len = try downCast(u6, user.shell.len - 1);
|
||||
const gecos_len = try downCast(u10, user.gecos.len);
|
||||
const gecos_len = try downCast(u8, user.gecos.len);
|
||||
|
||||
try validateUtf8(user.home);
|
||||
try validateUtf8(user.name);
|
||||
@@ -117,13 +118,13 @@ pub const UserWriter = struct {
|
||||
var puser = PackedUser{
|
||||
.uid = user.uid,
|
||||
.gid = user.gid,
|
||||
.additional_gids_offset = 1 << 29 - 1,
|
||||
.shell_here = self.shellIndexFn(user.shell) == null,
|
||||
.shell_len_or_idx = self.shellIndexFn(user.shell) orelse shell_len,
|
||||
.home_len = home_len,
|
||||
.name_is_a_suffix = std.mem.endsWith(u8, user.home, user.name),
|
||||
.name_len = name_len,
|
||||
.gecos_len = gecos_len,
|
||||
.padding = 0,
|
||||
};
|
||||
|
||||
try self.appendTo.appendSlice(std.mem.asBytes(&puser));
|
||||
@@ -241,7 +242,13 @@ pub const UserReader = struct {
|
||||
const testing = std.testing;
|
||||
|
||||
test "PackedUser internal and external alignment" {
|
||||
try testing.expectEqual(@bitSizeOf(PackedUser), @sizeOf(PackedUser) * 8);
|
||||
// External padding (PackedUserAlignmentBits) must be higher or equal to
|
||||
// the "internal" PackedUser alignment. By aligning PackedUser we are also
|
||||
// working around https://github.com/ziglang/zig/issues/10958 ; PackedUser
|
||||
// cannot be converted from/to [@bitSizeOf(PackedUser)/8]u8;
|
||||
// asBytes/bytesAsValue use @sizeOf, which is larger. Now we are putting no
|
||||
// more than 1, but it probably could be higher.
|
||||
try testing.expect(@bitSizeOf(PackedUser) - @sizeOf(PackedUser) * 8 <= 8);
|
||||
}
|
||||
|
||||
fn testShellIndex(shell: []const u8) ?u6 {
|
||||
@@ -284,7 +291,7 @@ test "construct PackedUser section" {
|
||||
.uid = 0,
|
||||
.gid = 4294967295,
|
||||
.name = "n" ** 32,
|
||||
.gecos = "g" ** 1023,
|
||||
.gecos = "g" ** 255,
|
||||
.home = "h" ** 64,
|
||||
.shell = "s" ** 64,
|
||||
} };
|
||||
|
||||
Reference in New Issue
Block a user