Skip to content

Commit

Permalink
Validate crate name in CLI option --extern
Browse files Browse the repository at this point in the history
  • Loading branch information
fmease committed Sep 20, 2023
1 parent f072775 commit 58a610f
Show file tree
Hide file tree
Showing 11 changed files with 59 additions and 2 deletions.
13 changes: 13 additions & 0 deletions compiler/rustc_session/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2451,6 2451,19 @@ pub fn parse_externs(
Some((opts, name)) => (Some(opts), name.to_string()),
};

if !crate::utils::is_ascii_ident(&name) {
let mut error = handler.early_struct_error(format!(
"crate name `{name}` passed to `--extern` is not a valid ASCII identifier"
));
let adjusted_name = name.replace("-", "_");
if crate::utils::is_ascii_ident(&adjusted_name) {
error.help(format!(
"consider replacing the dashes with underscores: `{adjusted_name}`"
));
}
error.emit();
}

let path = path.map(|p| CanonicalizedPath::new(p));

let entry = externs.entry(name.to_owned());
Expand Down
9 changes: 9 additions & 0 deletions compiler/rustc_session/src/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1710,6 1710,15 @@ impl EarlyErrorHandler {
self.handler.struct_fatal(msg).emit()
}

#[allow(rustc::untranslatable_diagnostic)]
#[allow(rustc::diagnostic_outside_of_impl)]
pub(crate) fn early_struct_error(
&self,
msg: impl Into<DiagnosticMessage>,
) -> DiagnosticBuilder<'_, !> {
self.handler.struct_fatal(msg)
}

#[allow(rustc::untranslatable_diagnostic)]
#[allow(rustc::diagnostic_outside_of_impl)]
pub fn early_warn(&self, msg: impl Into<DiagnosticMessage>) {
Expand Down
9 changes: 9 additions & 0 deletions compiler/rustc_session/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,3 158,12 @@ pub fn extra_compiler_flags() -> Option<(Vec<String>, bool)> {

if !result.is_empty() { Some((result, excluded_cargo_defaults)) } else { None }
}

pub(crate) fn is_ascii_ident(string: &str) -> bool {
let mut chars = string.chars();
if let Some(start) = chars.next() && (start.is_ascii_alphabetic() || start == '_') {
chars.all(|char| char.is_ascii_alphanumeric() || char == '_')
} else {
false
}
}
2 changes: 1 addition & 1 deletion tests/run-make/incr-foreign-head-span/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 15,7 @@ INCR=$(TMPDIR)/incr
all:
cp first_crate.rs second_crate.rs $(TMPDIR)
$(RUSTC) $(TMPDIR)/first_crate.rs -C incremental=$(INCR) --target $(TARGET) --crate-type lib
$(RUSTC) $(TMPDIR)/second_crate.rs -C incremental=$(INCR) --target $(TARGET) --extern first-crate=$(TMPDIR) --crate-type lib
$(RUSTC) $(TMPDIR)/second_crate.rs -C incremental=$(INCR) --target $(TARGET) --extern first_crate=$(TMPDIR)/libfirst_crate.rlib --crate-type lib
rm $(TMPDIR)/first_crate.rs
$(RUSTC) $(TMPDIR)/second_crate.rs -C incremental=$(INCR) --target $(TARGET) --cfg second_run --crate-type lib

10 changes: 10 additions & 0 deletions tests/ui/extern-flag/invalid-crate-name-dashed.rs
Original file line number Diff line number Diff line change
@@ -0,0 1,10 @@
// compile-flags: --extern=my-awesome-library=libawesome.rlib
// error-pattern: crate name `my-awesome-library` passed to `--extern` is not a valid ASCII identifier
// error-pattern: consider replacing the dashes with underscores: `my_awesome_library`

// In a sense, this is a regression test for issue #113035. We no longer suggest
// `pub use my-awesome-library::*;` (sic!) as we outright ban this crate name.

pub use my_awesome_library::*;

fn main() {}
4 changes: 4 additions & 0 deletions tests/ui/extern-flag/invalid-crate-name-dashed.stderr
Original file line number Diff line number Diff line change
@@ -0,0 1,4 @@
error: crate name `my-awesome-library` passed to `--extern` is not a valid ASCII identifier
|
= help: consider replacing the dashes with underscores: `my_awesome_library`

4 changes: 4 additions & 0 deletions tests/ui/extern-flag/invalid-crate-name-non-ascii.rs
Original file line number Diff line number Diff line change
@@ -0,0 1,4 @@
// compile-flags: --extern čɍαţē=libnon_ascii.rlib
// error-pattern: crate name `čɍαţē` passed to `--extern` is not a valid ASCII identifier

fn main() {}
2 changes: 2 additions & 0 deletions tests/ui/extern-flag/invalid-crate-name-non-ascii.stderr
Original file line number Diff line number Diff line change
@@ -0,0 1,2 @@
error: crate name `čɍαţē` passed to `--extern` is not a valid ASCII identifier

4 changes: 4 additions & 0 deletions tests/ui/extern-flag/invalid-crate-name.rs
Original file line number Diff line number Diff line change
@@ -0,0 1,4 @@
// compile-flags: --extern=?#1%$
// error-pattern: crate name `?#1%$` passed to `--extern` is not a valid ASCII identifier

fn main() {}
2 changes: 2 additions & 0 deletions tests/ui/extern-flag/invalid-crate-name.stderr
Original file line number Diff line number Diff line change
@@ -0,0 1,2 @@
error: crate name `?#1%$` passed to `--extern` is not a valid ASCII identifier

2 changes: 1 addition & 1 deletion tests/ui/rust-2018/trait-import-suggestions.rs
Original file line number Diff line number Diff line change
@@ -1,6 1,6 @@
// edition:2018
// aux-build:trait-import-suggestions.rs
// compile-flags:--extern trait-import-suggestions
// compile-flags:--extern trait_import_suggestions

mod foo {
mod foobar {
Expand Down

0 comments on commit 58a610f

Please sign in to comment.