From 5dcae1bbf5bbfeba9f57e4aef88a4a736a22000c Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 30 Sep 2025 10:46:31 -0500 Subject: [PATCH 1/4] refactor(toml): Make embedded manifest parsing more dynamic --- src/cargo/util/toml/mod.rs | 70 +++++++------------------------------- 1 file changed, 13 insertions(+), 57 deletions(-) diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index f6954cd52f2..ac3fa58fd81 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -1377,70 +1377,26 @@ pub fn to_real_manifest( } if is_embedded { - let invalid_fields = [ + let mut invalid_fields = vec![ ("`workspace`", original_toml.workspace.is_some()), ("`lib`", original_toml.lib.is_some()), ("`bin`", original_toml.bin.is_some()), ("`example`", original_toml.example.is_some()), ("`test`", original_toml.test.is_some()), ("`bench`", original_toml.bench.is_some()), - ( - "`package.workspace`", - original_toml - .package() - .map(|p| p.workspace.is_some()) - .unwrap_or(false), - ), - ( - "`package.build`", - original_toml - .package() - .map(|p| p.build.is_some()) - .unwrap_or(false), - ), - ( - "`package.links`", - original_toml - .package() - .map(|p| p.links.is_some()) - .unwrap_or(false), - ), - ( - "`package.autolib`", - original_toml - .package() - .map(|p| p.autolib.is_some()) - .unwrap_or(false), - ), - ( - "`package.autobins`", - original_toml - .package() - .map(|p| p.autobins.is_some()) - .unwrap_or(false), - ), - ( - "`package.autoexamples`", - original_toml - .package() - .map(|p| p.autoexamples.is_some()) - .unwrap_or(false), - ), - ( - "`package.autotests`", - original_toml - .package() - .map(|p| p.autotests.is_some()) - .unwrap_or(false), - ), - ( - "`package.autobenches`", - original_toml - .package() - .map(|p| p.autobenches.is_some()) - .unwrap_or(false), - ), ]; + if let Some(package) = original_toml.package() { + invalid_fields.extend([ + ("`package.workspace`", package.workspace.is_some()), + ("`package.build`", package.build.is_some()), + ("`package.links`", package.links.is_some()), + ("`package.autolib`", package.autolib.is_some()), + ("`package.autobins`", package.autobins.is_some()), + ("`package.autoexamples`", package.autoexamples.is_some()), + ("`package.autotests`", package.autotests.is_some()), + ("`package.autobenches`", package.autobenches.is_some()), + ]); + } let invalid_fields = invalid_fields .into_iter() .filter_map(|(name, invalid)| invalid.then_some(name)) From fa910e3536479a4fe57a46807c1c09cfbcd4f05d Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 30 Sep 2025 10:53:33 -0500 Subject: [PATCH 2/4] refactor(toml): Have rustc ensure new fields are allowed/rejected in embedded manifests --- src/cargo/util/toml/mod.rs | 88 ++++++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 14 deletions(-) diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index ac3fa58fd81..e7d2a7c8cd5 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -1377,24 +1377,84 @@ pub fn to_real_manifest( } if is_embedded { + let manifest::TomlManifest { + cargo_features: _, + package: _, + project: _, + badges: _, + features: _, + lib, + bin, + example, + test, + bench, + dependencies: _, + dev_dependencies: _, + dev_dependencies2: _, + build_dependencies: _, + build_dependencies2: _, + target: _, + lints: _, + hints: _, + workspace, + profile: _, + patch: _, + replace: _, + _unused_keys: _, + } = &original_toml; let mut invalid_fields = vec![ - ("`workspace`", original_toml.workspace.is_some()), - ("`lib`", original_toml.lib.is_some()), - ("`bin`", original_toml.bin.is_some()), - ("`example`", original_toml.example.is_some()), - ("`test`", original_toml.test.is_some()), - ("`bench`", original_toml.bench.is_some()), + ("`workspace`", workspace.is_some()), + ("`lib`", lib.is_some()), + ("`bin`", bin.is_some()), + ("`example`", example.is_some()), + ("`test`", test.is_some()), + ("`bench`", bench.is_some()), ]; if let Some(package) = original_toml.package() { + let manifest::TomlPackage { + edition: _, + rust_version: _, + name: _, + version: _, + authors: _, + build, + metabuild: _, + default_target: _, + forced_target: _, + links, + exclude: _, + include: _, + publish: _, + workspace, + im_a_teapot: _, + autolib, + autobins, + autoexamples, + autotests, + autobenches, + default_run: _, + description: _, + homepage: _, + documentation: _, + readme: _, + keywords: _, + categories: _, + license: _, + license_file: _, + repository: _, + resolver: _, + metadata: _, + _invalid_cargo_features: _, + } = package.as_ref(); invalid_fields.extend([ - ("`package.workspace`", package.workspace.is_some()), - ("`package.build`", package.build.is_some()), - ("`package.links`", package.links.is_some()), - ("`package.autolib`", package.autolib.is_some()), - ("`package.autobins`", package.autobins.is_some()), - ("`package.autoexamples`", package.autoexamples.is_some()), - ("`package.autotests`", package.autotests.is_some()), - ("`package.autobenches`", package.autobenches.is_some()), + ("`package.workspace`", workspace.is_some()), + ("`package.build`", build.is_some()), + ("`package.links`", links.is_some()), + ("`package.autolib`", autolib.is_some()), + ("`package.autobins`", autobins.is_some()), + ("`package.autoexamples`", autoexamples.is_some()), + ("`package.autotests`", autotests.is_some()), + ("`package.autobenches`", autobenches.is_some()), ]); } let invalid_fields = invalid_fields From d9e3424904ceb3d222d2c752fdcda7a803d771cb Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 30 Sep 2025 10:55:19 -0500 Subject: [PATCH 3/4] fix(toml): Prevent more build.rs fields in Cargo scripts --- src/cargo/util/toml/mod.rs | 9 ++++++--- .../cargo_remove/script/in/cargo-remove-test-fixture.rs | 3 --- .../cargo_remove/script/out/cargo-remove-test-fixture.rs | 3 --- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index e7d2a7c8cd5..98d2991ca12 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -1391,8 +1391,8 @@ pub fn to_real_manifest( dependencies: _, dev_dependencies: _, dev_dependencies2: _, - build_dependencies: _, - build_dependencies2: _, + build_dependencies, + build_dependencies2, target: _, lints: _, hints: _, @@ -1409,6 +1409,8 @@ pub fn to_real_manifest( ("`example`", example.is_some()), ("`test`", test.is_some()), ("`bench`", bench.is_some()), + ("`build-dependencies`", build_dependencies.is_some()), + ("`build_dependencies`", build_dependencies2.is_some()), ]; if let Some(package) = original_toml.package() { let manifest::TomlPackage { @@ -1418,7 +1420,7 @@ pub fn to_real_manifest( version: _, authors: _, build, - metabuild: _, + metabuild, default_target: _, forced_target: _, links, @@ -1449,6 +1451,7 @@ pub fn to_real_manifest( invalid_fields.extend([ ("`package.workspace`", workspace.is_some()), ("`package.build`", build.is_some()), + ("`package.metabuild`", metabuild.is_some()), ("`package.links`", links.is_some()), ("`package.autolib`", autolib.is_some()), ("`package.autobins`", autobins.is_some()), diff --git a/tests/testsuite/cargo_remove/script/in/cargo-remove-test-fixture.rs b/tests/testsuite/cargo_remove/script/in/cargo-remove-test-fixture.rs index 99662ce110a..d95a56911a6 100644 --- a/tests/testsuite/cargo_remove/script/in/cargo-remove-test-fixture.rs +++ b/tests/testsuite/cargo_remove/script/in/cargo-remove-test-fixture.rs @@ -1,9 +1,6 @@ --- edition = "2015" -[build-dependencies] -semver = "0.1.0" - [dependencies] docopt = "0.6" rustc-serialize = "0.4" diff --git a/tests/testsuite/cargo_remove/script/out/cargo-remove-test-fixture.rs b/tests/testsuite/cargo_remove/script/out/cargo-remove-test-fixture.rs index 16bdb60288c..156528b7026 100644 --- a/tests/testsuite/cargo_remove/script/out/cargo-remove-test-fixture.rs +++ b/tests/testsuite/cargo_remove/script/out/cargo-remove-test-fixture.rs @@ -1,9 +1,6 @@ --- edition = "2015" -[build-dependencies] -semver = "0.1.0" - [dependencies] rustc-serialize = "0.4" semver = "0.1" From d815619309bb6ec132642d1e36915e8d3f07c6c8 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 30 Sep 2025 10:56:29 -0500 Subject: [PATCH 4/4] fix(toml): Prevent multi-crate fields in Cargo scripts --- src/cargo/util/toml/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index 98d2991ca12..4e5e8485e71 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -1434,7 +1434,7 @@ pub fn to_real_manifest( autoexamples, autotests, autobenches, - default_run: _, + default_run, description: _, homepage: _, documentation: _, @@ -1458,6 +1458,7 @@ pub fn to_real_manifest( ("`package.autoexamples`", autoexamples.is_some()), ("`package.autotests`", autotests.is_some()), ("`package.autobenches`", autobenches.is_some()), + ("`package.default-run`", default_run.is_some()), ]); } let invalid_fields = invalid_fields