diff options
author | 2023-01-21 15:36:40 -0800 | |
---|---|---|
committer | 2023-01-21 15:36:51 -0800 | |
commit | 17bde9bc86e97bd1d9f2dc80924dde780b759635 (patch) | |
tree | 8b5f03d197d0ea54b38c82e155bfa1d5ec475011 /src/install/install.zig | |
parent | fd29d05c6aa447518e68a2572fae411efa80ea9f (diff) | |
download | bun-17bde9bc86e97bd1d9f2dc80924dde780b759635.tar.gz bun-17bde9bc86e97bd1d9f2dc80924dde780b759635.tar.zst bun-17bde9bc86e97bd1d9f2dc80924dde780b759635.zip |
Fix test failure due to UB
Diffstat (limited to 'src/install/install.zig')
-rw-r--r-- | src/install/install.zig | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/src/install/install.zig b/src/install/install.zig index c630732a1..aff7a3fec 100644 --- a/src/install/install.zig +++ b/src/install/install.zig @@ -1446,13 +1446,13 @@ pub const PackageManager = struct { } }; - pub fn failRootResolution(this: *PackageManager, dependency: Dependency, dependency_id: PackageID, err: anyerror) void { + pub fn failRootResolution(this: *PackageManager, dependency: *const Dependency, dependency_id: PackageID, err: anyerror) void { if (this.dynamic_root_dependencies) |*dynamic| { dynamic.items[dependency_id].failed = err; if (this.onWake.context) |ctx| { this.onWake.getonDependencyError()( ctx, - dependency, + dependency.*, dependency_id, err, ); @@ -1535,7 +1535,7 @@ pub const PackageManager = struct { if (is_main) { this.enqueueDependencyWithMainAndSuccessFn( index, - cloned_dependency, + &cloned_dependency, invalid_package_id, true, assignRootResolution, @@ -1547,7 +1547,7 @@ pub const PackageManager = struct { } else { this.enqueueDependencyWithMainAndSuccessFn( index, - cloned_dependency, + &cloned_dependency, invalid_package_id, false, assignRootResolution, @@ -2093,7 +2093,7 @@ pub const PackageManager = struct { package.resolution.value.npm.version, ); - if (try this.generateNetworkTaskForTarball(task_id, manifest.str(find_result.package.tarball_url), package)) |network_task| { + if (try this.generateNetworkTaskForTarball(task_id, manifest.str(&find_result.package.tarball_url), package)) |network_task| { return ResolvedPackageResult{ .package = package, .is_first_time = true, @@ -2164,7 +2164,7 @@ pub const PackageManager = struct { } const SuccessFn = *const fn (*PackageManager, PackageID, PackageID) void; - const FailFn = *const fn (*PackageManager, Dependency, PackageID, anyerror) void; + const FailFn = *const fn (*PackageManager, *const Dependency, PackageID, anyerror) void; fn assignResolution(this: *PackageManager, dependency_id: PackageID, package_id: PackageID) void { this.lockfile.buffers.resolutions.items[dependency_id] = package_id; } @@ -2193,6 +2193,9 @@ pub const PackageManager = struct { resolution: PackageID, comptime successFn: SuccessFn, ) !?ResolvedPackageResult { + name.assertDefined(); + alias.assertDefined(); + if (resolution < this.lockfile.packages.len) { return ResolvedPackageResult{ .package = this.lockfile.packages.get(resolution) }; } @@ -2397,7 +2400,8 @@ pub const PackageManager = struct { fn enqueueDependencyWithMain( this: *PackageManager, id: u32, - dependency: Dependency, + /// This must be a *const to prevent UB + dependency: *const Dependency, resolution: PackageID, comptime is_main: bool, ) !void { @@ -2411,21 +2415,21 @@ pub const PackageManager = struct { ); } + /// Q: "What do we do with a dependency in a package.json?" + /// A: "We enqueue it!" pub fn enqueueDependencyWithMainAndSuccessFn( this: *PackageManager, id: u32, - dependency: Dependency, + /// This must be a *const to prevent UB + dependency: *const Dependency, resolution: PackageID, comptime is_main: bool, comptime successFn: SuccessFn, comptime failFn: ?FailFn, ) !void { const alias = dependency.name; - const name = switch (dependency.version.tag) { - .npm => dependency.version.value.npm.name, - .dist_tag => dependency.version.value.dist_tag.name, - else => alias, - }; + const name = dependency.realname(); + const name_hash = switch (dependency.version.tag) { .dist_tag, .npm => Lockfile.stringHash(this.lockfile.str(&name)), else => dependency.name_hash, @@ -2721,9 +2725,10 @@ pub const PackageManager = struct { var i: u32 = dependencies_list.off; const end = dependencies_list.off + dependencies_list.len; while (i < end) : (i += 1) { + const dependency = lockfile.buffers.dependencies.items[i]; this.enqueueDependencyWithMain( i, - lockfile.buffers.dependencies.items[i], + &dependency, lockfile.buffers.resolutions.items[i], false, ) catch {}; @@ -2769,10 +2774,12 @@ pub const PackageManager = struct { const end = dependencies_list.off + dependencies_list.len; // we have to be very careful with pointers here while (i < end) : (i += 1) { + const dependency = lockfile.buffers.dependencies.items[i]; + const resolution = lockfile.buffers.resolutions.items[i]; this.enqueueDependencyWithMain( i, - lockfile.buffers.dependencies.items[i], - lockfile.buffers.resolutions.items[i], + &dependency, + resolution, is_main, ) catch {}; } @@ -2816,7 +2823,7 @@ pub const PackageManager = struct { try this.enqueueDependencyWithMain( dependency_id, - dependency, + &dependency, resolution, false, ); @@ -2829,7 +2836,7 @@ pub const PackageManager = struct { try this.enqueueDependencyWithMainAndSuccessFn( dependency_id, - dependency, + &dependency, resolution, true, assignRootResolution, @@ -6289,9 +6296,10 @@ pub const PackageManager = struct { while (counter_i < changes) : (counter_i += 1) { if (remaining[counter_i] == invalid_package_id) { dependency_i = counter_i + off; + const dependency = manager.lockfile.buffers.dependencies.items[dependency_i]; try manager.enqueueDependencyWithMain( dependency_i, - manager.lockfile.buffers.dependencies.items[dependency_i], + &dependency, manager.lockfile.buffers.resolutions.items[dependency_i], true, ); |