Skip to content

Commit

Permalink
std.tar: fix fuzzing crashes ziglang#1
Browse files Browse the repository at this point in the history
this patch converts all the crashes submitted by @squeek502
(in ziglang#15382 (comment))
to errors.

HeaderIterator:
* add bounds checks to PaxIterator.next()
* convert several unsafe int casts to safe ones

misc:
* added FileType.tagName() for debugging which returns null for unnamed
enum values
* make unixTime() fallible
  • Loading branch information
travisstaloch committed May 2, 2023
1 parent b67585c commit cbbb2ff
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 116 deletions.
110 changes: 55 additions & 55 deletions lib/std/compress/tar/reader_test.zig
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ test "std.tar validate testdata headers" {
.uid = 73025,
.gid = 5000,
.size = 5,
.mtime = unixTime(1244428340, 0),
.mtime = try unixTime(1244428340, 0),
.type = .normal,
.uname = "dsymonds",
.gname = "eng",
Expand All @@ -51,7 +51,7 @@ test "std.tar validate testdata headers" {
.uid = 73025,
.gid = 5000,
.size = 11,
.mtime = unixTime(1244436044, 0),
.mtime = try unixTime(1244436044, 0),
.type = .normal,
.uname = "dsymonds",
.gname = "eng",
Expand All @@ -71,7 +71,7 @@ test "std.tar validate testdata headers" {
.uid = 1000,
.gid = 1000,
.size = 200,
.mtime = unixTime(1392395740, 0),
.mtime = try unixTime(1392395740, 0),
.type = @intToEnum(FileType, 0x53),
.linkname = "",
.uname = "david",
Expand All @@ -85,7 +85,7 @@ test "std.tar validate testdata headers" {
.uid = 1000,
.gid = 1000,
.size = 200,
.mtime = unixTime(1392342187, 0),
.mtime = try unixTime(1392342187, 0),
.type = @intToEnum(FileType, 0x30),
.linkname = "",
.uname = "david",
Expand All @@ -104,7 +104,7 @@ test "std.tar validate testdata headers" {
.uid = 1000,
.gid = 1000,
.size = 200,
.mtime = unixTime(1392340456, 0),
.mtime = try unixTime(1392340456, 0),
.type = @intToEnum(FileType, 0x30),
.linkname = "",
.uname = "david",
Expand All @@ -124,7 +124,7 @@ test "std.tar validate testdata headers" {
.uid = 1000,
.gid = 1000,
.size = 200,
.mtime = unixTime(1392337404, 0),
.mtime = try unixTime(1392337404, 0),
.type = @intToEnum(FileType, 0x30),
.linkname = "",
.uname = "david",
Expand All @@ -144,7 +144,7 @@ test "std.tar validate testdata headers" {
.uid = 1000,
.gid = 1000,
.size = 4,
.mtime = unixTime(1392398319, 0),
.mtime = try unixTime(1392398319, 0),
.type = @intToEnum(FileType, 0x30),
.linkname = "",
.uname = "david",
Expand All @@ -169,24 +169,24 @@ test "std.tar validate testdata headers" {
.uid = 73025,
.gid = 5000,
.size = 5,
.mtime = unixTime(1244592783, 0),
.mtime = try unixTime(1244592783, 0),
.type = .normal,
.uname = "dsymonds",
.gname = "eng",
.atime = unixTime(1244592783, 0),
.ctime = unixTime(1244592783, 0),
.atime = try unixTime(1244592783, 0),
.ctime = try unixTime(1244592783, 0),
}, .{
.name = "small2.txt",
.mode = 0o640,
.uid = 73025,
.gid = 5000,
.size = 11,
.mtime = unixTime(1244592783, 0),
.mtime = try unixTime(1244592783, 0),
.type = .normal,
.uname = "dsymonds",
.gname = "eng",
.atime = unixTime(1244592783, 0),
.ctime = unixTime(1244592783, 0),
.atime = try unixTime(1244592783, 0),
.ctime = try unixTime(1244592783, 0),
} },
},
.{
Expand All @@ -197,15 +197,15 @@ test "std.tar validate testdata headers" {
.uid = 73025,
.gid = 5000,
.size = 5,
.mtime = unixTime(1244593104, 0),
.mtime = try unixTime(1244593104, 0),
.type = .normal,
}, .{
.name = "small2.txt",
.mode = 0o444,
.uid = 73025,
.gid = 5000,
.size = 11,
.mtime = unixTime(1244593104, 0),
.mtime = try unixTime(1244593104, 0),
.type = .normal,
} },
},
Expand All @@ -219,9 +219,9 @@ test "std.tar validate testdata headers" {
.uname = "shane",
.gname = "shane",
.size = 7,
.mtime = unixTime(1350244992, 23960108),
.ctime = unixTime(1350244992, 23960108),
.atime = unixTime(1350244992, 23960108),
.mtime = try unixTime(1350244992, 23960108),
.ctime = try unixTime(1350244992, 23960108),
.atime = try unixTime(1350244992, 23960108),
.type = .normal,
.pax_recs = &.{
"path", "a/123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
Expand All @@ -238,9 +238,9 @@ test "std.tar validate testdata headers" {
.uname = "shane",
.gname = "shane",
.size = 0,
.mtime = unixTime(1350266320, 910238425),
.ctime = unixTime(1350266320, 910238425),
.atime = unixTime(1350266320, 910238425),
.mtime = try unixTime(1350266320, 910238425),
.ctime = try unixTime(1350266320, 910238425),
.atime = try unixTime(1350266320, 910238425),
.type = .symbolic_link,
.linkname = "123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
.pax_recs = &.{
Expand Down Expand Up @@ -268,7 +268,7 @@ test "std.tar validate testdata headers" {
.uid = 319973,
.gid = 5000,
.size = 999,
.mtime = unixTime(1442282516, 0),
.mtime = try unixTime(1442282516, 0),
.type = .normal,
.uname = "joetsai",
.gname = "eng",
Expand All @@ -287,7 +287,7 @@ test "std.tar validate testdata headers" {
.type = .normal,
.name = "file",
.uname = str_long_x10,
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.pax_recs = &.{
"GOLANG.pkg", "tar",
"comment", "Hello, 世界",
Expand All @@ -306,13 +306,13 @@ test "std.tar validate testdata headers" {
}, .{
.type = .normal,
.name = "file1",
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.fmt = FormatSet.initOne(.ustar),
}, .{
.type = .normal,
.name = "file2",
.pax_recs = &.{ "path", "file2" },
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.fmt = FormatSet.initOne(.pax),
}, .{
.type = .global_extended_header,
Expand All @@ -322,12 +322,12 @@ test "std.tar validate testdata headers" {
}, .{
.type = .normal,
.name = "file3",
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.fmt = FormatSet.initOne(.ustar),
}, .{
.type = .normal,
.name = "file4",
.mtime = unixTime(1400000000, 0),
.mtime = try unixTime(1400000000, 0),
.pax_recs = &.{ "mtime", "1400000000" },
.fmt = FormatSet.initOne(.pax),
} },
Expand All @@ -340,7 +340,7 @@ test "std.tar validate testdata headers" {
.uid = 0,
.gid = 0,
.size = 14,
.mtime = unixTime(1365454838, 0),
.mtime = try unixTime(1365454838, 0),
.type = .normal,
.linkname = "",
.uname = "eyefi",
Expand All @@ -359,12 +359,12 @@ test "std.tar validate testdata headers" {
.uid = 1000,
.gid = 10,
.size = 5,
.mtime = unixTime(1386065770, 448252320),
.mtime = try unixTime(1386065770, 448252320),
.type = .normal,
.uname = "alex",
.gname = "wheel",
.atime = unixTime(1389782991, 419875220),
.ctime = unixTime(1389782956, 794414986),
.atime = try unixTime(1389782991, 419875220),
.ctime = try unixTime(1389782956, 794414986),
.pax_recs = &.{
"user.key", "value",
"user.key2", "value2",
Expand All @@ -385,12 +385,12 @@ test "std.tar validate testdata headers" {
.uid = 1000,
.gid = 10,
.size = 11,
.mtime = unixTime(1386065770, 449252304),
.mtime = try unixTime(1386065770, 449252304),
.type = .normal,
.uname = "alex",
.gname = "wheel",
.atime = unixTime(1389782991, 419875220),
.ctime = unixTime(1386065770, 449252304),
.atime = try unixTime(1389782991, 419875220),
.ctime = try unixTime(1386065770, 449252304),
.pax_recs = &.{
"security.selinux", ".unconfined_u=.object_r=.default_t=s0\x00",
"mtime", "1386065770.449252304",
Expand All @@ -408,7 +408,7 @@ test "std.tar validate testdata headers" {
.headers = &.{.{
.name = "GNU2/GNU2/long-path-name",
.linkname = "GNU4/GNU4/long-linkpath-name",
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.type = .symbolic_link,
.fmt = FormatSet.initOne(.gnu),
}},
Expand All @@ -425,38 +425,38 @@ test "std.tar validate testdata headers" {
.uid = 1000,
.gid = 1000,
.size = 14,
.mtime = unixTime(1441973427, 0),
.mtime = try unixTime(1441973427, 0),
.type = @intToEnum(FileType, 'D'),
.uname = "rawr",
.gname = "dsnet",
.atime = unixTime(1441974501, 0),
.ctime = unixTime(1441973436, 0),
.atime = try unixTime(1441974501, 0),
.ctime = try unixTime(1441973436, 0),
.fmt = FormatSet.initOne(.gnu),
}, .{
.name = "test2/foo",
.mode = 33188,
.uid = 1000,
.gid = 1000,
.size = 64,
.mtime = unixTime(1441973363, 0),
.mtime = try unixTime(1441973363, 0),
.type = .normal,
.uname = "rawr",
.gname = "dsnet",
.atime = unixTime(1441974501, 0),
.ctime = unixTime(1441973436, 0),
.atime = try unixTime(1441974501, 0),
.ctime = try unixTime(1441973436, 0),
.fmt = FormatSet.initOne(.gnu),
}, .{
.name = "test2/sparse",
.mode = 33188,
.uid = 1000,
.gid = 1000,
.size = 536870912,
.mtime = unixTime(1441973427, 0),
.mtime = try unixTime(1441973427, 0),
.type = @intToEnum(FileType, 'S'),
.uname = "rawr",
.gname = "dsnet",
.atime = unixTime(1441991948, 0),
.ctime = unixTime(1441973436, 0),
.atime = try unixTime(1441991948, 0),
.ctime = try unixTime(1441973436, 0),
.fmt = FormatSet.initOne(.gnu),
} },
},
Expand All @@ -466,7 +466,7 @@ test "std.tar validate testdata headers" {
.headers = &.{.{
.name = "bar",
.linkname = "PAX4/PAX4/long-linkpath-name",
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.type = @intToEnum(tar.FileType, '2'),
.pax_recs = &.{
"linkpath", "PAX4/PAX4/long-linkpath-name",
Expand All @@ -484,7 +484,7 @@ test "std.tar validate testdata headers" {
.mode = 0o644,
.uid = 1000,
.gid = 1000,
.mtime = unixTime(1486082191, 0),
.mtime = try unixTime(1486082191, 0),
.type = .normal,
.uname = "rawr",
.gname = "dsnet",
Expand All @@ -503,7 +503,7 @@ test "std.tar validate testdata headers" {
.mode = 0o644,
.uid = 1000,
.gid = 1000,
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.type = .normal,
.uname = "☺",
.gname = "⚹",
Expand All @@ -522,7 +522,7 @@ test "std.tar validate testdata headers" {
.mode = 0o644,
.uid = 1000,
.gid = 1000,
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.type = .normal,
.uname = "rawr",
.gname = "dsnet",
Expand Down Expand Up @@ -568,7 +568,7 @@ test "std.tar validate testdata headers" {
.headers = &.{.{
.name = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/foo",
.uid = 0o10000000,
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.type = .normal,
}},
},
Expand All @@ -579,7 +579,7 @@ test "std.tar validate testdata headers" {
.name = "file",
.mode = 0o644,
.type = .normal,
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.dev_major = 1,
.dev_minor = 1,
.fmt = FormatSet.initOne(.ustar),
Expand All @@ -592,7 +592,7 @@ test "std.tar validate testdata headers" {
.name = "sparse.db",
.type = .gnu_sparse,
.size = 1000,
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.fmt = FormatSet.initOne(.gnu),
}},
},
Expand All @@ -604,7 +604,7 @@ test "std.tar validate testdata headers" {
.name = "sparse.db",
.type = .gnu_sparse,
.size = 1000,
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.fmt = FormatSet.initOne(.gnu),
}},
},
Expand All @@ -616,7 +616,7 @@ test "std.tar validate testdata headers" {
.name = "sparse.db",
.type = .normal,
.size = 1000,
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.pax_recs = &.{
"size", "1512",
"GNU.sparse.major", "1",
Expand All @@ -635,7 +635,7 @@ test "std.tar validate testdata headers" {
.name = "sparse.db",
.type = .normal,
.size = 1000,
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.pax_recs = &.{
"size", "512",
"GNU.sparse.major", "1",
Expand All @@ -651,7 +651,7 @@ test "std.tar validate testdata headers" {
.headers = &.{.{
.type = .directory,
.name = one_to_nine_slash_x30,
.mtime = unixTime(0, 0),
.mtime = try unixTime(0, 0),
.pax_recs = &.{ "path", one_to_nine_slash_x30 },
.fmt = FormatSet.initOne(.pax),
}},
Expand Down
1 change: 1 addition & 0 deletions lib/std/compress/tar/test_common.zig
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const std = @import("std");

/// testing helper for decompressing a .gz file. returns an io.fixedBufferStream
/// with the decompressed data. caller owns the returned FixedBufferStream.buffer
pub fn decompressGz(
Expand Down
Loading

0 comments on commit cbbb2ff

Please sign in to comment.