diff --git a/src/shellpop.zig b/src/shellpop.zig index c9589b2..6c79651 100644 --- a/src/shellpop.zig +++ b/src/shellpop.zig @@ -43,22 +43,21 @@ const ShellPopcon = struct { .blob = try BoundedArray(u8, MaxShells * MaxShellLen).init(0), .indices = StringHashMap(u10).init(allocator), }; - var offset: u10 = 0; + var fullOffset: u12 = 0; var idx: u10 = 0; while (idx < shells.len) { const len = @intCast(u6, shells.get(idx).len); try self.blob.appendSlice(shells.get(idx)); - const ourShell = self.blob.constSlice()[offset .. offset + len]; + const ourShell = self.blob.constSlice()[fullOffset .. fullOffset + len]; try self.indices.put(ourShell, idx); self.index.set(idx, ShellIndex{ - .offset = offset >> 2, + .offset = @intCast(u10, fullOffset >> 2), .len = len, }); - offset += len; // Padd padding to make offset divisible by 4. - const padding = (offset + 3) & ~@intCast(u10, 3); - offset += padding; + const padding = (fullOffset + 3) & ~@intCast(u12, 3); + fullOffset += len + padding; try self.blob.appendNTimes(0, padding); idx += 1; } @@ -170,15 +169,15 @@ test "basic shellpopcon" { try testing.expectEqual(sections.getIndex(bash).?, 2); try testing.expectEqual(sections.getIndex(nobody), null); - const longIndex = sections.getIndex(long).?; - const start = sections.index.get(longIndex).offset << 2; - const end = start + sections.index.get(longIndex).len; - const gotLong = sections.blob.constSlice()[start..end]; + const idx = sections.getIndex(zsh).?; + const start = sections.index.get(idx).offset << 2; + const end = start + sections.index.get(idx).len; + const got = sections.blob.constSlice()[start..end]; const stderr = std.io.getStdErr().writer(); try stderr.print("\n", .{}); - try stderr.print("gotLong: {s}\n", .{gotLong}); - try stderr.print(" long: {s}\n", .{long}); - try testing.expectEqual(gotLong, long); + try stderr.print("gotLong: {s}\n", .{got}); + try stderr.print(" long: {s}\n", .{zsh}); + try testing.expectEqual(got, zsh); }