authorgravatar for igor.anic@gmail.comIgor Anić <igor.anic@gmail.com> 2024-02-24 16:22:54+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-02-24 13:17:04-08:00
log8d651f512bf5032e1255dd66750faff0152e2f84
tree799f41ae576ce4bf25bf0e3384db25e22ce99947
parent3eacd1b2e56728a291b4e5dc443a56fa0b4cab14

std.tar fix assert exploited by fuzzing


3 files changed, 11 insertions(+), 1 deletions(-)

lib/std/tar.zig+7-1
...@@ -376,7 +376,7 @@ fn Iterator(comptime ReaderType: type) type {...@@ -376,7 +376,7 @@ fn Iterator(comptime ReaderType: type) type {
376 self.file.link_name = try attr.value(&self.link_name_buffer);376 self.file.link_name = try attr.value(&self.link_name_buffer);
377 },377 },
378 .size => {378 .size => {
379 var buf: [64]u8 = undefined;379 var buf: [pax_max_size_attr_len]u8 = undefined;
380 self.file.size = try std.fmt.parseInt(u64, try attr.value(&buf), 10);380 self.file.size = try std.fmt.parseInt(u64, try attr.value(&buf), 10);
381 },381 },
382 }382 }
...@@ -430,6 +430,9 @@ const PaxAttributeKind = enum {...@@ -430,6 +430,9 @@ const PaxAttributeKind = enum {
430 size,430 size,
431};431};
432432
433// maxInt(u64) has 20 chars, base 10 in practice we got 24 chars
434const pax_max_size_attr_len = 64;
435
433fn PaxIterator(comptime ReaderType: type) type {436fn PaxIterator(comptime ReaderType: type) type {
434 return struct {437 return struct {
435 size: usize, // cumulative size of all pax attributes438 size: usize, // cumulative size of all pax attributes
...@@ -486,6 +489,9 @@ fn PaxIterator(comptime ReaderType: type) type {...@@ -486,6 +489,9 @@ fn PaxIterator(comptime ReaderType: type) type {
486 try validateAttributeEnding(self.reader);489 try validateAttributeEnding(self.reader);
487 continue;490 continue;
488 };491 };
492 if (kind == .size and value_len > pax_max_size_attr_len) {
493 return error.PaxSizeAttrOverflow;
494 }
489 return Attribute{495 return Attribute{
490 .kind = kind,496 .kind = kind,
491 .len = value_len,497 .len = value_len,
lib/std/tar/test.zig+4
...@@ -317,6 +317,10 @@ test "tar run Go test cases" {...@@ -317,6 +317,10 @@ test "tar run Go test cases" {
317 .data = @embedFile("testdata/fuzz1.tar"),317 .data = @embedFile("testdata/fuzz1.tar"),
318 .err = error.TarCorruptInput,318 .err = error.TarCorruptInput,
319 },319 },
320 .{
321 .data = @embedFile("testdata/fuzz2.tar"),
322 .err = error.PaxSizeAttrOverflow,
323 },
320 };324 };
321325
322 for (cases) |case| {326 for (cases) |case| {
lib/std/tar/testdata/fuzz2.tar created
Binary files /dev/null and b/lib/std/tar/testdata/fuzz2.tar differ