zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit d1ce8b8837ef5ede6ccc5fb9118f2c583cfcfa6e (tree)
parent ca8c6dd4d65abaadaf0633f4a72e5c0ed79b3c53
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Mon, 15 Jan 2024 23:02:50 -0800

Merge pull request #18168 from cipharius/feature/zig-build-fossil-support

Adds support for Fossil SCM source tree archives as zig build dependencies
Diffstat:
Mlib/std/tar.zig | 21+++++++++++++--------
Msrc/Package/Fetch.zig | 4+++-
2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/lib/std/tar.zig b/lib/std/tar.zig @@ -536,14 +536,15 @@ pub fn pipeToFileSystem(dir: std.fs.Dir, reader: anytype, options: Options) !voi while (try iter.next()) |file| { switch (file.kind) { .directory => { - const file_name = try stripComponents(file.name, options.strip_components); + const file_name = stripComponents(file.name, options.strip_components); if (file_name.len != 0 and !options.exclude_empty_directories) { try dir.makePath(file_name); } }, .normal => { if (file.size == 0 and file.name.len == 0) return; - const file_name = try stripComponents(file.name, options.strip_components); + const file_name = stripComponents(file.name, options.strip_components); + if (file_name.len == 0) return error.BadFileName; const fs_file = dir.createFile(file_name, .{}) catch |err| switch (err) { error.FileNotFound => again: { @@ -575,7 +576,8 @@ pub fn pipeToFileSystem(dir: std.fs.Dir, reader: anytype, options: Options) !voi }, .symbolic_link => { // The file system path of the symbolic link. - const file_name = try stripComponents(file.name, options.strip_components); + const file_name = stripComponents(file.name, options.strip_components); + if (file_name.len == 0) return error.BadFileName; // The data inside the symbolic link. const link_name = file.link_name; @@ -604,14 +606,15 @@ pub fn pipeToFileSystem(dir: std.fs.Dir, reader: anytype, options: Options) !voi } } -fn stripComponents(path: []const u8, count: u32) ![]const u8 { +fn stripComponents(path: []const u8, count: u32) []const u8 { var i: usize = 0; var c = count; while (c > 0) : (c -= 1) { if (std.mem.indexOfScalarPos(u8, path, i, '/')) |pos| { i = pos + 1; } else { - return error.TarComponentsOutsideStrippedPrefix; + i = path.len; + break; } } return path[i..]; @@ -619,9 +622,11 @@ fn stripComponents(path: []const u8, count: u32) ![]const u8 { test "tar stripComponents" { const expectEqualStrings = std.testing.expectEqualStrings; - try expectEqualStrings("a/b/c", try stripComponents("a/b/c", 0)); - try expectEqualStrings("b/c", try stripComponents("a/b/c", 1)); - try expectEqualStrings("c", try stripComponents("a/b/c", 2)); + try expectEqualStrings("a/b/c", stripComponents("a/b/c", 0)); + try expectEqualStrings("b/c", stripComponents("a/b/c", 1)); + try expectEqualStrings("c", stripComponents("a/b/c", 2)); + try expectEqualStrings("", stripComponents("a/b/c", 3)); + try expectEqualStrings("", stripComponents("a/b/c", 4)); } test "tar PaxIterator" { diff --git a/src/Package/Fetch.zig b/src/Package/Fetch.zig @@ -982,7 +982,9 @@ fn unpackResource( if (ascii.eqlIgnoreCase(mime_type, "application/zstd")) break :ft .@"tar.zst"; - if (!ascii.eqlIgnoreCase(mime_type, "application/octet-stream")) { + if (!ascii.eqlIgnoreCase(mime_type, "application/octet-stream") and + !ascii.eqlIgnoreCase(mime_type, "application/x-compressed")) + { return f.fail(f.location_tok, try eb.printString( "unrecognized 'Content-Type' header: '{s}'", .{content_type},