From 1a3762b90516b5faf5aaea2242e7960d2d55d9c4 Mon Sep 17 00:00:00 2001 From: pwygab <88221256+merelymyself@users.noreply.github.com> Date: Thu, 29 Sep 2022 06:08:38 +0800 Subject: [PATCH] prevent alias name from being filesize or number (#6595) * prevent alias name from being filesize or number * add test * fmt --- Cargo.lock | 1 + crates/nu-command/tests/commands/alias.rs | 22 ++++++++++++++++++++++ crates/nu-parser/Cargo.toml | 1 + crates/nu-parser/src/errors.rs | 5 +++++ crates/nu-parser/src/parse_keywords.rs | 17 ++++++++++++++--- 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2370b6948c..a31753c719 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2801,6 +2801,7 @@ dependencies = [ name = "nu-parser" version = "0.69.2" dependencies = [ + "bytesize", "chrono", "itertools", "log", diff --git a/crates/nu-command/tests/commands/alias.rs b/crates/nu-command/tests/commands/alias.rs index cd700b4ab4..800f4fcabd 100644 --- a/crates/nu-command/tests/commands/alias.rs +++ b/crates/nu-command/tests/commands/alias.rs @@ -40,3 +40,25 @@ fn alias_hiding_2() { assert_eq!(actual.out, "0"); } + +#[test] +fn alias_fails_with_invalid_name() { + let actual = nu!( + cwd: "tests/fixtures/formats", pipeline( + r#" + alias 1234 = echo "test" + "# + )); + assert!(actual + .err + .contains("alias name can't be a number or a filesize")); + let actual = nu!( + cwd: "tests/fixtures/formats", pipeline( + r#" + alias 5gib = echo "test" + "# + )); + assert!(actual + .err + .contains("alias name can't be a number or a filesize")); +} diff --git a/crates/nu-parser/Cargo.toml b/crates/nu-parser/Cargo.toml index aab183d78c..a9e838f325 100644 --- a/crates/nu-parser/Cargo.toml +++ b/crates/nu-parser/Cargo.toml @@ -8,6 +8,7 @@ name = "nu-parser" version = "0.69.2" [dependencies] +bytesize = "1.1.0" chrono = "0.4.21" itertools = "0.10" miette = "5.1.0" diff --git a/crates/nu-parser/src/errors.rs b/crates/nu-parser/src/errors.rs index 6e158d7b83..5002b690b4 100644 --- a/crates/nu-parser/src/errors.rs +++ b/crates/nu-parser/src/errors.rs @@ -112,6 +112,10 @@ pub enum ParseError { #[diagnostic(code(nu::parser::variable_not_valid), url(docsrs))] VariableNotValid(#[label = "variable name can't contain spaces or quotes"] Span), + #[error("Alias name not supported.")] + #[diagnostic(code(nu::parser::variable_not_valid), url(docsrs))] + AliasNotValid(#[label = "alias name can't be a number or a filesize"] Span), + #[error("Module not found.")] #[diagnostic( code(nu::parser::module_not_found), @@ -344,6 +348,7 @@ impl ParseError { ParseError::MultipleRestParams(s) => *s, ParseError::VariableNotFound(s) => *s, ParseError::VariableNotValid(s) => *s, + ParseError::AliasNotValid(s) => *s, ParseError::ModuleNotFound(s) => *s, ParseError::CyclicalModuleImport(_, s) => *s, ParseError::ModuleOrOverlayNotFound(s) => *s, diff --git a/crates/nu-parser/src/parse_keywords.rs b/crates/nu-parser/src/parse_keywords.rs index 01c2aaa19b..1a3c3c80d3 100644 --- a/crates/nu-parser/src/parse_keywords.rs +++ b/crates/nu-parser/src/parse_keywords.rs @@ -544,16 +544,27 @@ pub fn parse_alias( spans: &[Span], expand_aliases_denylist: &[usize], ) -> (Pipeline, Option) { - let (name_span, split_id) = + let (name_span, alias_name, split_id) = if spans.len() > 1 && working_set.get_span_contents(spans[0]) == b"export" { - (spans[1], 2) + (spans[1], spans.get(2), 2) } else { - (spans[0], 1) + (spans[0], spans.get(1), 1) }; let name = working_set.get_span_contents(name_span); if name == b"alias" { + if let Some(alias_name) = alias_name { + let alias_name = String::from_utf8_lossy(working_set.get_span_contents(*alias_name)); + if alias_name.parse::().is_ok() || alias_name.parse::().is_ok() + { + return ( + Pipeline::from_vec(vec![garbage(name_span)]), + Some(ParseError::AliasNotValid(name_span)), + ); + } + } + if let Some((span, err)) = check_name(working_set, spans) { return (Pipeline::from_vec(vec![garbage(*span)]), Some(err)); }