From 6decd85d0d4d3441cb11a56d50af562d6f15739b Mon Sep 17 00:00:00 2001 From: ConnorSkees <39542938+ConnorSkees@users.noreply.github.com> Date: Thu, 4 Jun 2020 15:13:58 -0400 Subject: [PATCH] handle invalid escape sequences in variable names --- src/utils/peek_until.rs | 6 ++++-- tests/variables.rs | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/utils/peek_until.rs b/src/utils/peek_until.rs index ffc654a..922f7c2 100644 --- a/src/utils/peek_until.rs +++ b/src/utils/peek_until.rs @@ -115,9 +115,10 @@ pub(crate) fn peek_escape>( ) -> SassResult { let mut value = 0; let first = match toks.peek() { - Some(t) => t, + Some(t) => *t, None => return Ok(String::new()), }; + let mut span = first.pos; if first.kind == '\n' { return Err(("Expected escape sequence.", first.pos()).into()); } else if first.kind.is_ascii_hexdigit() { @@ -131,6 +132,7 @@ pub(crate) fn peek_escape>( } value *= 16; value += as_hex(next.kind); + span = span.merge(next.pos); toks.peek_forward(1); } if toks.peek().is_some() && toks.peek().unwrap().kind.is_whitespace() { @@ -140,7 +142,7 @@ pub(crate) fn peek_escape>( value = toks.peek_forward(1).unwrap().kind as u32; } - let c = std::char::from_u32(value).unwrap(); + let c = std::char::from_u32(value).ok_or(("Invalid escape sequence.", span))?; if is_name(c) { Ok(c.to_string()) } else if value <= 0x1F || value == 0x7F { diff --git a/tests/variables.rs b/tests/variables.rs index fefe32e..bad5ee6 100644 --- a/tests/variables.rs +++ b/tests/variables.rs @@ -139,3 +139,7 @@ error!( undefined_variable, "a {color: $a;}", "Error: Undefined variable." ); +error!( + invalid_escape, + "$\\110000: red;", "Error: Invalid escape sequence." +);