From 0859ee1247355e35317c846519559913cf555dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20R=C3=B6ttsches?= Date: Mon, 8 Jan 2024 16:59:07 +0200 Subject: [PATCH] [Skrifa] Avoid initialization of HashSet with system random numbers Workaround for [1] and [2] - issues in the Chrome sandbox requiring access to random number generators. [1] https://bugs.chromium.org/p/chromium/issues/detail?id=1516634 [2] https://bugs.chromium.org/p/chromium/issues/detail?id=1516641 --- skrifa/src/color/mod.rs | 6 ++++-- skrifa/src/color/traversal.rs | 17 +++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/skrifa/src/color/mod.rs b/skrifa/src/color/mod.rs index 33a568515..0c021afa4 100644 --- a/skrifa/src/color/mod.rs +++ b/skrifa/src/color/mod.rs @@ -57,7 +57,9 @@ use read_fonts::{ use std::{collections::HashSet, fmt::Debug, ops::Range}; -use traversal::{get_clipbox_font_units, traverse_v0_range, traverse_with_callbacks}; +use traversal::{ + get_clipbox_font_units, traverse_v0_range, traverse_with_callbacks, NonRandomHasherState, +}; pub use transform::Transform; @@ -322,7 +324,7 @@ impl<'a> ColorGlyph<'a> { painter.push_clip_box(rect); } - let mut visited_set: HashSet = HashSet::new(); + let mut visited_set = HashSet::with_hasher(NonRandomHasherState {}); visited_set.insert(*paint_id); traverse_with_callbacks( &resolve_paint(&instance, paint)?, diff --git a/skrifa/src/color/traversal.rs b/skrifa/src/color/traversal.rs index ede56ed02..c52838630 100644 --- a/skrifa/src/color/traversal.rs +++ b/skrifa/src/color/traversal.rs @@ -1,4 +1,7 @@ -use std::{cmp::Ordering, collections::HashSet, ops::Range}; +use std::{ + cmp::Ordering, collections::hash_map::DefaultHasher, collections::HashSet, hash::BuildHasher, + ops::Range, +}; use read_fonts::{ tables::colr::{CompositeMode, Extend}, @@ -13,6 +16,16 @@ use super::{ Brush, ColorPainter, ColorStop, PaintCachedColorGlyph, PaintError, }; +// Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=1516634. +pub(crate) struct NonRandomHasherState; + +impl BuildHasher for NonRandomHasherState { + type Hasher = DefaultHasher; + fn build_hasher(&self) -> DefaultHasher { + DefaultHasher::new() + } +} + pub(crate) fn get_clipbox_font_units( colr_instance: &ColrInstance, glyph_id: GlyphId, @@ -43,7 +56,7 @@ pub(crate) fn traverse_with_callbacks( paint: &ResolvedPaint, instance: &ColrInstance, painter: &mut impl ColorPainter, - visited_set: &mut HashSet, + visited_set: &mut HashSet, ) -> Result<(), PaintError> { match paint { ResolvedPaint::ColrLayers { range } => {