diff options
author | 2023-09-05 14:25:19 -0700 | |
---|---|---|
committer | 2023-09-05 14:25:19 -0700 | |
commit | 1e998c1bf2e0c95fb182eb01806bf11eebe6fed3 (patch) | |
tree | 21ba4289dd7be6b621505ca084960ae6b7c9a5ef /src/install/lockfile.zig | |
parent | bc2b55fdeee3001b07252d0f250671ea1876a3ed (diff) | |
download | bun-1e998c1bf2e0c95fb182eb01806bf11eebe6fed3.tar.gz bun-1e998c1bf2e0c95fb182eb01806bf11eebe6fed3.tar.zst bun-1e998c1bf2e0c95fb182eb01806bf11eebe6fed3.zip |
fix(install): ensure all lockfile structs do not have undefined padding (#4401)
* padding sucks
* this assertion is already done elsewhere
* remove test. will be covered alex's pr i believe?
* fix webkit submodule
* fix uws submodule
Diffstat (limited to 'src/install/lockfile.zig')
-rw-r--r-- | src/install/lockfile.zig | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/install/lockfile.zig b/src/install/lockfile.zig index 1291c648a..0b5e0d7bc 100644 --- a/src/install/lockfile.zig +++ b/src/install/lockfile.zig @@ -88,6 +88,8 @@ const NameHashMap = std.ArrayHashMapUnmanaged(u32, String, ArrayIdentityContext, const NameHashSet = std.ArrayHashMapUnmanaged(u32, void, ArrayIdentityContext, false); const VersionHashMap = std.ArrayHashMapUnmanaged(u32, Semver.Version, ArrayIdentityContext, false); +const assertNoUninitializedPadding = @import("./padding_checker.zig").assertNoUninitializedPadding; + // Serialized data /// The version of the lockfile format, intended to prevent data corruption for format changes. format: FormatVersion = .v1, @@ -3632,9 +3634,13 @@ pub const Package = extern struct { pub const Meta = extern struct { origin: Origin = Origin.npm, + _padding_origin: u8 = 0, + arch: Npm.Architecture = Npm.Architecture.all, os: Npm.OperatingSystem = Npm.OperatingSystem.all, + _padding_os: u16 = 0, + id: PackageID = invalid_package_id, man_dir: String = String{}, @@ -3731,7 +3737,10 @@ pub const Package = extern struct { var sliced = list.slice(); inline for (FieldsEnum.fields) |field| { - try writer.writeAll(std.mem.sliceAsBytes(sliced.items(@field(Lockfile.Package.List.Field, field.name)))); + const value = sliced.items(@field(Lockfile.Package.List.Field, field.name)); + + comptime assertNoUninitializedPadding(@TypeOf(value)); + try writer.writeAll(std.mem.sliceAsBytes(value)); } const really_end_at = try stream.getPos(); @@ -3782,7 +3791,10 @@ pub const Package = extern struct { var sliced = list.slice(); inline for (FieldsEnum.fields) |field| { - var bytes = std.mem.sliceAsBytes(sliced.items(@field(Lockfile.Package.List.Field, field.name))); + const value = sliced.items(@field(Lockfile.Package.List.Field, field.name)); + + comptime assertNoUninitializedPadding(@TypeOf(value)); + var bytes = std.mem.sliceAsBytes(value); const end_pos = stream.pos + bytes.len; if (end_pos <= end_at) { @memcpy(bytes, stream.buffer[stream.pos..][0..bytes.len]); @@ -3913,7 +3925,9 @@ const Buffers = struct { } pub fn writeArray(comptime StreamType: type, stream: StreamType, comptime Writer: type, writer: Writer, comptime ArrayList: type, array: ArrayList) !void { + comptime assertNoUninitializedPadding(@TypeOf(array)); const bytes = std.mem.sliceAsBytes(array); + const start_pos = try stream.getPos(); try writer.writeIntLittle(u64, 0xDEADBEEF); try writer.writeIntLittle(u64, 0xDEADBEEF); |