Skip to content

Commit

Permalink
Package.Fetch: resolve instead of join relative paths
Browse files Browse the repository at this point in the history
This prevents bogus "error: file exists in multiple modules" errors due
to file paths looking like:
```
note: root of module foo/freetype/
note: root of module foo/fontconfig/../freetype/
```

It also enables checking for dependency paths outside the root package.
  • Loading branch information
andrewrk committed Oct 8, 2023
1 parent 29156de commit 1fd95fc
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 1 deletion.
8 changes: 8 additions & 0 deletions src/Package.zig
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ pub const Path = struct {
};
}

pub fn resolvePosix(p: Path, arena: Allocator, sub_path: []const u8) Allocator.Error!Path {
if (sub_path.len == 0) return p;
return .{
.root_dir = p.root_dir,
.sub_path = try fs.path.resolvePosix(arena, &.{ p.sub_path, sub_path }),
};
}

pub fn joinString(p: Path, allocator: Allocator, sub_path: []const u8) Allocator.Error![]u8 {
const parts: []const []const u8 =
if (p.sub_path.len == 0) &.{sub_path} else &.{ p.sub_path, sub_path };
Expand Down
8 changes: 7 additions & 1 deletion src/Package/Fetch.zig
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,13 @@ pub fn run(f: *Fetch) RunError!void {
f.hash_tok,
try eb.addString("path-based dependencies are not hashed"),
);
f.package_root = try f.parent_package_root.join(arena, sub_path);
f.package_root = try f.parent_package_root.resolvePosix(arena, sub_path);
if (std.mem.startsWith(u8, f.package_root.sub_path, "../")) {
return f.fail(
f.location_tok,
try eb.addString("dependency path outside package"),
);
}
try loadManifest(f, f.package_root);
try checkBuildFileExistence(f);
if (!f.job_queue.recursive) return;
Expand Down

0 comments on commit 1fd95fc

Please sign in to comment.