Skip to content

Commit 132f00d

Browse files
authored
Harden against some potential overflows (#25)
1 parent 9bbf8a1 commit 132f00d

2 files changed

Lines changed: 19 additions & 3 deletions

File tree

src/lib.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ impl<'a> Face<'a> {
434434
let i = self.records.binary_search_by(|record| record.tag.cmp(&tag)).ok()?;
435435
let record = self.records.get(i)?;
436436
let start = record.offset as usize;
437-
let end = start + (record.length as usize);
437+
let end = start.checked_add(record.length as usize)?;
438438
self.data.get(start..end)
439439
}
440440
}
@@ -684,4 +684,19 @@ mod tests {
684684

685685
assert_eq!(result, Err(Error::CFFError));
686686
}
687+
688+
#[test]
689+
fn table_record_with_invalid_bounds_returns_none() {
690+
let face = Face {
691+
data: &[],
692+
records: vec![TableRecord {
693+
tag: Tag::HEAD,
694+
checksum: 0,
695+
offset: u32::MAX,
696+
length: u32::MAX,
697+
}],
698+
};
699+
700+
assert_eq!(face.table(Tag::HEAD), None);
701+
}
687702
}

src/read.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,9 @@ impl<'a> Reader<'a> {
5050
/// Read a certain number of bytes.
5151
#[inline]
5252
pub fn read_bytes(&mut self, len: usize) -> Option<&'a [u8]> {
53-
let v = self.data.get(self.offset..self.offset + len)?;
54-
self.offset += len;
53+
let end = self.offset.checked_add(len)?;
54+
let v = self.data.get(self.offset..end)?;
55+
self.offset = end;
5556
Some(v)
5657
}
5758

0 commit comments

Comments
 (0)