mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-05 11:08:12 +02:00
Merge branch 'fix_use_after_free_race' into 'master'
Fix usage of FT_Face after FT_Done_Face and unsynchronised access to FT_Library and num_open_faces Closes #436 See merge request cairo/cairo!81
This commit is contained in:
commit
76b0dd3a6b
1 changed files with 8 additions and 2 deletions
|
|
@ -718,14 +718,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);
|
||||
|
||||
|
|
@ -741,7 +745,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,
|
||||
|
|
@ -749,6 +752,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 (_cairo_ft_to_cairo_error (error));
|
||||
|
|
@ -762,6 +766,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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue