From d2f1667cd54e131050b29b4d44c106db5a2132be Mon Sep 17 00:00:00 2001 From: Michal Sudolsky Date: Mon, 23 Nov 2020 19:55:07 +0100 Subject: [PATCH 1/5] fix usage of FT_Face after FT_Done_Face --- src/cairo-ft-font.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cairo-ft-font.c b/src/cairo-ft-font.c index d2221edec..1f9d1a965 100644 --- a/src/cairo-ft-font.c +++ b/src/cairo-ft-font.c @@ -712,14 +712,18 @@ _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) CAIRO_MUTEX_LOCK (unscaled->mutex); unscaled->lock_count++; + font_map = _cairo_ft_unscaled_font_map_lock (); + if (unscaled->face) + { + _cairo_ft_unscaled_font_map_unlock (); return unscaled->face; + } /* If this unscaled font was created from an FT_Face then we just * returned it above. */ assert (!unscaled->from_face); - font_map = _cairo_ft_unscaled_font_map_lock (); { assert (font_map != NULL); From c70c98ee231bf3ac0045937bf5ce76481015ec78 Mon Sep 17 00:00:00 2001 From: Michal Sudolsky Date: Mon, 23 Nov 2020 19:57:18 +0100 Subject: [PATCH 2/5] sync access to FT_Library and num_open_faces --- src/cairo-ft-font.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cairo-ft-font.c b/src/cairo-ft-font.c index 1f9d1a965..fecad9342 100644 --- a/src/cairo-ft-font.c +++ b/src/cairo-ft-font.c @@ -739,7 +739,6 @@ _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) _font_map_release_face_lock_held (font_map, entry); } } - _cairo_ft_unscaled_font_map_unlock (); error = FT_New_Face (font_map->ft_library, unscaled->filename, @@ -747,6 +746,7 @@ _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) &face); if (error) { + _cairo_ft_unscaled_font_map_unlock (); unscaled->lock_count--; CAIRO_MUTEX_UNLOCK (unscaled->mutex); _cairo_error_throw (_ft_to_cairo_error (error)); @@ -760,6 +760,8 @@ _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) font_map->num_open_faces++; + _cairo_ft_unscaled_font_map_unlock (); + return face; } From 8fe1443ec9dda30b7a94f40e29ce24dcd7a28496 Mon Sep 17 00:00:00 2001 From: Heiko Lewin Date: Mon, 18 Oct 2021 11:11:54 +0200 Subject: [PATCH 3/5] Lock cairo_ft_unscaled_font_t before reading --- src/cairo-ft-font.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cairo-ft-font.c b/src/cairo-ft-font.c index 2910c1fe1..16601a495 100644 --- a/src/cairo-ft-font.c +++ b/src/cairo-ft-font.c @@ -697,8 +697,11 @@ static cairo_bool_t _has_unlocked_face (const void *entry) { const cairo_ft_unscaled_font_t *unscaled = entry; - - return (!unscaled->from_face && unscaled->lock_count == 0 && unscaled->face); + cairo_bool_t result; + CAIRO_MUTEX_LOCK (unscaled->mutex); + result = (!unscaled->from_face && unscaled->lock_count == 0 && unscaled->face); + CAIRO_MUTEX_UNLOCK (unscaled->mutex); + return result; } /* Ensures that an unscaled font has a face object. If we exceed From 9f76177607380dfb615c6b37090f5e53457683dd Mon Sep 17 00:00:00 2001 From: Heiko Lewin Date: Tue, 19 Oct 2021 17:21:46 +0200 Subject: [PATCH 4/5] _cairo_ft_unscaled_font_lock_face: keep lock on face while modifying --- src/cairo-ft-font.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/cairo-ft-font.c b/src/cairo-ft-font.c index 16601a495..ca2243ba5 100644 --- a/src/cairo-ft-font.c +++ b/src/cairo-ft-font.c @@ -700,7 +700,11 @@ _has_unlocked_face (const void *entry) cairo_bool_t result; CAIRO_MUTEX_LOCK (unscaled->mutex); result = (!unscaled->from_face && unscaled->lock_count == 0 && unscaled->face); - CAIRO_MUTEX_UNLOCK (unscaled->mutex); + if (!result) { + CAIRO_MUTEX_UNLOCK (unscaled->mutex); + } else { + // Caller must unlock the mutex + } return result; } @@ -744,7 +748,8 @@ _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) if (entry == NULL) break; - _font_map_release_face_lock_held (font_map, entry); + _font_map_release_face_lock_held (font_map, entry); + CAIRO_MUTEX_UNLOCK (entry->mutex); } } From e69b6e78050d5a80508bd2c96f3daf60c3117fc0 Mon Sep 17 00:00:00 2001 From: Heiko Lewin Date: Tue, 19 Oct 2021 18:46:53 +0200 Subject: [PATCH 5/5] cairo-ft-font.c: use font_map-lock for lock_count manipulations --- src/cairo-ft-font.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/cairo-ft-font.c b/src/cairo-ft-font.c index ca2243ba5..1b638dd13 100644 --- a/src/cairo-ft-font.c +++ b/src/cairo-ft-font.c @@ -698,13 +698,7 @@ _has_unlocked_face (const void *entry) { const cairo_ft_unscaled_font_t *unscaled = entry; cairo_bool_t result; - CAIRO_MUTEX_LOCK (unscaled->mutex); result = (!unscaled->from_face && unscaled->lock_count == 0 && unscaled->face); - if (!result) { - CAIRO_MUTEX_UNLOCK (unscaled->mutex); - } else { - // Caller must unlock the mutex - } return result; } @@ -722,9 +716,9 @@ _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) FT_Error error; CAIRO_MUTEX_LOCK (unscaled->mutex); - unscaled->lock_count++; font_map = _cairo_ft_unscaled_font_map_lock (); + unscaled->lock_count++; if (unscaled->face) { @@ -748,8 +742,7 @@ _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) if (entry == NULL) break; - _font_map_release_face_lock_held (font_map, entry); - CAIRO_MUTEX_UNLOCK (entry->mutex); + _font_map_release_face_lock_held (font_map, entry); } } @@ -759,8 +752,8 @@ _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) &face); if (error) { + unscaled->lock_count--; _cairo_ft_unscaled_font_map_unlock (); - unscaled->lock_count--; CAIRO_MUTEX_UNLOCK (unscaled->mutex); _cairo_error_throw (_ft_to_cairo_error (error)); return NULL; @@ -784,10 +777,11 @@ _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) static void _cairo_ft_unscaled_font_unlock_face (cairo_ft_unscaled_font_t *unscaled) { + _cairo_ft_unscaled_font_map_lock (); assert (unscaled->lock_count > 0); unscaled->lock_count--; - + _cairo_ft_unscaled_font_map_unlock (); CAIRO_MUTEX_UNLOCK (unscaled->mutex); }