Merge "Handle symlinks to license files in subdirectory" into main
diff --git a/tools/external_crates/crate_tool/src/main.rs b/tools/external_crates/crate_tool/src/main.rs
index 9a2e9ea..068004e 100644
--- a/tools/external_crates/crate_tool/src/main.rs
+++ b/tools/external_crates/crate_tool/src/main.rs
@@ -17,7 +17,7 @@
     path::PathBuf,
 };
 
-use anyhow::Result;
+use anyhow::{bail, Result};
 use clap::{Args, Parser, Subcommand};
 use crate_tool::{
     default_repo_root, maybe_build_cargo_embargo, ManagedRepo, SemverCompatibilityRule,
@@ -166,6 +166,9 @@
         Ok(if self.all {
             managed_repo.all_crate_names()?.difference(&self.exclude).cloned().collect::<Vec<_>>()
         } else {
+            if self.crates.is_empty() {
+                bail!("No crates specified");
+            }
             self.crates.clone()
         })
     }
diff --git a/tools/external_crates/crate_tool/src/managed_repo.rs b/tools/external_crates/crate_tool/src/managed_repo.rs
index e672ef7..07f40da 100644
--- a/tools/external_crates/crate_tool/src/managed_repo.rs
+++ b/tools/external_crates/crate_tool/src/managed_repo.rs
@@ -51,7 +51,9 @@
 // TODO: Store this as a data file in the monorepo.
 static IMPORT_DENYLIST: LazyLock<BTreeSet<&str>> = LazyLock::new(|| {
     BTreeSet::from([
-        "instant", // Not maintained.
+        "instant",        // Not maintained.
+        "bumpalo",        // Unsound
+        "allocator-api2", // Unsound
         // Uniffi crates.
         // Per mmaurer: "considered too difficult to verify and stopped being used for the original use case".
         "oneshot-uniffi",