aboutsummaryrefslogtreecommitdiff
path: root/src/framework
diff options
context:
space:
mode:
authoracdenisSK <[email protected]>2018-07-06 16:02:00 +0200
committeracdenisSK <[email protected]>2018-07-06 16:05:18 +0200
commit4e4dcb11586520f798c831956dc42778c0205386 (patch)
tree4c194a47c63c210b642a2f5898c879bd6a313447 /src/framework
parentMake the Cache Update API public (#344) (diff)
downloadserenity-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.rs19
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)