Skip to content

Commit 0fa7148

Browse files
authored
Merge pull request #138 from cardigan1008/issue-overflow
Fix arithmetic overflow panics
2 parents 2081c29 + 164f787 commit 0fa7148

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/grapheme.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ impl GraphemeCursor {
412412
/// ```
413413
pub fn provide_context(&mut self, chunk: &str, chunk_start: usize) {
414414
use crate::tables::grapheme as gr;
415-
assert!(chunk_start + chunk.len() == self.pre_context_offset.unwrap());
415+
assert!(chunk_start.saturating_add(chunk.len()) == self.pre_context_offset.unwrap());
416416
self.pre_context_offset = None;
417417
if self.is_extended && chunk_start + chunk.len() == self.offset {
418418
let ch = chunk.chars().next_back().unwrap();
@@ -598,15 +598,15 @@ impl GraphemeCursor {
598598
if self.state == GraphemeState::NotBreak {
599599
return Ok(false);
600600
}
601-
if (self.offset < chunk_start || self.offset >= chunk_start + chunk.len())
602-
&& (self.offset > chunk_start + chunk.len() || self.cat_after.is_none())
601+
if (self.offset < chunk_start || self.offset >= chunk_start.saturating_add(chunk.len()))
602+
&& (self.offset > chunk_start.saturating_add(chunk.len()) || self.cat_after.is_none())
603603
{
604604
return Err(GraphemeIncomplete::InvalidOffset);
605605
}
606606
if let Some(pre_context_offset) = self.pre_context_offset {
607607
return Err(GraphemeIncomplete::PreContext(pre_context_offset));
608608
}
609-
let offset_in_chunk = self.offset - chunk_start;
609+
let offset_in_chunk = self.offset.saturating_sub(chunk_start);
610610
if self.cat_after.is_none() {
611611
let ch = chunk[offset_in_chunk..].chars().next().unwrap();
612612
self.cat_after = Some(self.grapheme_category(ch));
@@ -702,7 +702,7 @@ impl GraphemeCursor {
702702
self.cat_after = Some(self.grapheme_category(ch));
703703
}
704704
} else {
705-
self.offset += ch.len_utf8();
705+
self.offset = self.offset.saturating_add(ch.len_utf8());
706706
self.state = GraphemeState::Unknown;
707707
self.cat_before = self.cat_after.take();
708708
if self.cat_before.is_none() {
@@ -781,7 +781,9 @@ impl GraphemeCursor {
781781
if self.offset == chunk_start {
782782
return Err(GraphemeIncomplete::PrevChunk);
783783
}
784-
let mut iter = chunk[..self.offset - chunk_start].chars().rev();
784+
let mut iter = chunk[..self.offset.saturating_sub(chunk_start)]
785+
.chars()
786+
.rev();
785787
let mut ch = iter.next().unwrap();
786788
loop {
787789
if self.offset == chunk_start {

0 commit comments

Comments
 (0)