diff options
| author | acdenisSK <[email protected]> | 2018-07-06 16:02:00 +0200 |
|---|---|---|
| committer | acdenisSK <[email protected]> | 2018-07-06 16:05:18 +0200 |
| commit | 4e4dcb11586520f798c831956dc42778c0205386 (patch) | |
| tree | 4c194a47c63c210b642a2f5898c879bd6a313447 /src/framework | |
| parent | Make the Cache Update API public (#344) (diff) | |
| download | serenity-4e4dcb11586520f798c831956dc42778c0205386.tar.xz serenity-4e4dcb11586520f798c831956dc42778c0205386.zip | |
Don't assume all characters at end are 1-length
Unicode characters usually span out to more than 1-length. This would cause crashes when they appeared at the end
Diffstat (limited to 'src/framework')
| -rw-r--r-- | src/framework/standard/args.rs | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/framework/standard/args.rs b/src/framework/standard/args.rs index 2648a30..8af8124 100644 --- a/src/framework/standard/args.rs +++ b/src/framework/standard/args.rs @@ -53,6 +53,20 @@ impl<E: StdError> fmt::Display for Error<E> { type Result<T, E> = ::std::result::Result<T, Error<E>>; +fn find_start(s: &str, i: usize) -> Option<usize> { + if i > s.len() { + return None; + } + + let mut start = i - 1; + + while !s.is_char_boundary(start) { + start -= 1; + } + + Some(start) +} + fn find_end(s: &str, i: usize) -> Option<usize> { if i > s.len() { return None; @@ -176,10 +190,11 @@ impl<'a> Lexer<'a> { } self.next(); + let end = self.offset; - return if self.at_end() && &self.msg[end-1..end] != "\"" { - // invalid, missing an end quote; view it as a normal argument instead. + return if self.at_end() && &self.msg[find_start(self.msg, end).unwrap()..end] != "\"" { + // We're missing an end quote. View this as a normal argument. Token::new(TokenKind::Argument, &self.msg[start..], start) } else { Token::new(TokenKind::QuotedArgument, &self.msg[start..end], start) |