From 8d138e9c3fe7729d79c77def2bdf4df7063a69d4 Mon Sep 17 00:00:00 2001 From: Yevhenii Reizner Date: Fri, 19 Nov 2021 17:32:38 +0200 Subject: [PATCH] (glyf) Fix endless loop during malformed file parsing. Closes #79 --- CHANGELOG.md | 2 ++ src/tables/glyf.rs | 11 +++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6e64488..668db294 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Fixed +- (glyf) Endless loop during malformed file parsing. ## [0.13.2] - 2021-10-28 ### Added diff --git a/src/tables/glyf.rs b/src/tables/glyf.rs index bdff1815..8d2fa02a 100644 --- a/src/tables/glyf.rs +++ b/src/tables/glyf.rs @@ -500,7 +500,7 @@ fn outline_impl( data: &[u8], depth: u8, builder: &mut Builder, -) -> Option { +) -> Option> { if depth >= MAX_COMPONENTS { return None; } @@ -525,8 +525,7 @@ fn outline_impl( if let Some(glyph_data) = glyf_table.get(range) { let transform = Transform::combine(builder.transform, comp.transform); let mut b = Builder::new(transform, builder.bbox, builder.builder); - // We don't care about errors here. - let _ = outline_impl(loca_table, glyf_table, glyph_data, depth + 1, &mut b); + outline_impl(loca_table, glyf_table, glyph_data, depth + 1, &mut b)?; // Take updated bbox. builder.bbox = b.bbox; @@ -536,10 +535,10 @@ fn outline_impl( } if builder.bbox.is_default() { - return None; + return Some(None); } - builder.bbox.to_rect() + Some(builder.bbox.to_rect()) } #[inline] @@ -658,7 +657,7 @@ impl<'a> Table<'a> { ) -> Option { let mut b = Builder::new(Transform::default(), BBox::new(), builder); let glyph_data = self.get(glyph_id)?; - outline_impl(self.loca_table, self.data, glyph_data, 0, &mut b) + outline_impl(self.loca_table, self.data, glyph_data, 0, &mut b)? } #[inline]