Merge branch 'ftc_unref' into 'master'

[cache] Protect referenced nodes.

Closes #1401

See merge request freetype/freetype!419
This commit is contained in:
Alexei Podtelezhnikov 2026-04-23 04:15:49 -04:00
commit 41e58cef83
2 changed files with 23 additions and 7 deletions

10
src/cache/ftccache.c vendored
View file

@ -568,9 +568,13 @@
manager->cur_weight -= cache->clazz.node_weight( node, cache );
ftc_node_mru_unlink( node, manager );
cache->clazz.node_free( node, cache );
cache->slack++;
if ( node->ref_count <= 0 )
{
cache->clazz.node_free( node, cache );
cache->slack++;
}
else
node->link = node; /* mark unlinked */
}
else
pnode = &node->link;

20
src/cache/ftcmanag.c vendored
View file

@ -667,10 +667,22 @@
FTC_Node_Unref( FTC_Node node,
FTC_Manager manager )
{
if ( node &&
manager &&
node->cache_index < manager->num_caches )
node->ref_count--;
if ( !node || !manager ||
node->cache_index >= manager->num_caches )
return;
node->ref_count--;
/* free unlinked node */
if ( node->ref_count <= 0 && node->link == node )
{
FTC_Cache cache = manager->caches[node->cache_index];
cache->clazz.node_free( node, cache );
cache->slack++;
ftc_cache_resize( cache );
}
}