Skip to content

Commit 54f09d4

Browse files
committed
fix: arithmetic overflow
1 parent db6466c commit 54f09d4

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

src/grapheme.rs

+7-7
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));
@@ -694,7 +694,7 @@ impl GraphemeCursor {
694694
if self.offset == self.len {
695695
return Ok(None);
696696
}
697-
let mut iter = chunk[self.offset - chunk_start..].chars();
697+
let mut iter = chunk[self.offset.saturating_sub(chunk_start)..].chars();
698698
let mut ch = match iter.next() {
699699
Some(ch) => ch,
700700
None => return Err(GraphemeIncomplete::NextChunk),
@@ -705,7 +705,7 @@ impl GraphemeCursor {
705705
self.cat_after = Some(self.grapheme_category(ch));
706706
}
707707
} else {
708-
self.offset += ch.len_utf8();
708+
self.offset = self.offset.saturating_add(ch.len_utf8());
709709
self.state = GraphemeState::Unknown;
710710
self.cat_before = self.cat_after.take();
711711
if self.cat_before.is_none() {
@@ -784,7 +784,7 @@ impl GraphemeCursor {
784784
if self.offset == chunk_start {
785785
return Err(GraphemeIncomplete::PrevChunk);
786786
}
787-
let mut iter = chunk[..self.offset - chunk_start].chars().rev();
787+
let mut iter = chunk[..self.offset.saturating_sub(chunk_start)].chars().rev();
788788
let mut ch = iter.next().unwrap();
789789
loop {
790790
if self.offset == chunk_start {

0 commit comments

Comments
 (0)