Skip to content

Commit bb66bba

Browse files
Make PackageManifest.Serializer.readArray more careful (#12106)
1 parent ccd92a9 commit bb66bba

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

src/install/npm.zig

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -608,8 +608,8 @@ pub const PackageManifest = struct {
608608
alignment: usize,
609609
};
610610
var data: [fields.len]Data = undefined;
611-
for (fields, 0..) |field_info, i| {
612-
data[i] = .{
611+
for (fields, &data) |field_info, *dat| {
612+
dat.* = .{
613613
.size = @sizeOf(field_info.type),
614614
.name = field_info.name,
615615
.alignment = if (@sizeOf(field_info.type) == 0) 1 else field_info.alignment,
@@ -623,9 +623,9 @@ pub const PackageManifest = struct {
623623
std.sort.pdq(Data, &data, {}, Sort.lessThan);
624624
var sizes_bytes: [fields.len]usize = undefined;
625625
var names: [fields.len][]const u8 = undefined;
626-
for (data, 0..) |elem, i| {
627-
sizes_bytes[i] = elem.size;
628-
names[i] = elem.name;
626+
for (data, &sizes_bytes, &names) |elem, *size_, *name_| {
627+
size_.* = elem.size;
628+
name_.* = elem.name;
629629
}
630630
break :blk .{
631631
.bytes = sizes_bytes,
@@ -659,7 +659,11 @@ pub const PackageManifest = struct {
659659
}
660660

661661
stream.pos += Aligner.skipAmount(Type, stream.pos);
662-
const result_bytes = stream.buffer[stream.pos..][0..byte_len];
662+
const remaining = stream.buffer[@min(stream.pos, stream.buffer.len)..];
663+
if (remaining.len < byte_len) {
664+
return error.BufferTooSmall;
665+
}
666+
const result_bytes = remaining[0..byte_len];
663667
const result = @as([*]const Type, @ptrCast(@alignCast(result_bytes.ptr)))[0 .. result_bytes.len / @sizeOf(Type)];
664668
stream.pos += result_bytes.len;
665669
return result;

0 commit comments

Comments
 (0)