From d091bca546fa15928db36c8447e126ee43ddb5f4 Mon Sep 17 00:00:00 2001 From: Alexei Podtelezhnikov Date: Wed, 17 Apr 2024 00:33:14 -0400 Subject: [PATCH] [cache] Fix error handling. Manipulate the cache after a face is requested or a size is looked up successfully. Fixes #1270. * src/cache/ftcmanag.c (ftc_size_node_init, ftc_size_node_reset, ftc_face_node_init): Check for errors before accepting a change. * src/cache/ftcmru.c (FTC_MruList_New): Do nothing if reset fails. --- src/cache/ftcmanag.c | 38 +++++++++++++++++++++++++++----------- src/cache/ftcmru.c | 8 +++++--- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/cache/ftcmanag.c b/src/cache/ftcmanag.c index dd9bb6190..6b8b80e33 100644 --- a/src/cache/ftcmanag.c +++ b/src/cache/ftcmanag.c @@ -118,14 +118,21 @@ FT_Pointer ftcscaler, FT_Pointer ftcmanager ) { + FT_Error error; + FT_Size size; FTC_SizeNode node = (FTC_SizeNode)ftcnode; FTC_Scaler scaler = (FTC_Scaler)ftcscaler; FTC_Manager manager = (FTC_Manager)ftcmanager; - node->scaler = scaler[0]; + error = ftc_scaler_lookup_size( manager, scaler, &size ); + if ( !error ) + { + node->size = size; + node->scaler = scaler[0]; + } - return ftc_scaler_lookup_size( manager, scaler, &node->size ); + return error; } @@ -134,16 +141,23 @@ FT_Pointer ftcscaler, FT_Pointer ftcmanager ) { + FT_Error error; + FT_Size size; FTC_SizeNode node = (FTC_SizeNode)ftcnode; FTC_Scaler scaler = (FTC_Scaler)ftcscaler; FTC_Manager manager = (FTC_Manager)ftcmanager; - FT_Done_Size( node->size ); + error = ftc_scaler_lookup_size( manager, scaler, &size ); + if ( !error ) + { + FT_Done_Size( node->size ); - node->scaler = scaler[0]; + node->size = size; + node->scaler = scaler[0]; + } - return ftc_scaler_lookup_size( manager, scaler, &node->size ); + return error; } @@ -231,23 +245,25 @@ FT_Pointer ftcface_id, FT_Pointer ftcmanager ) { + FT_Error error; + FT_Face face; FTC_FaceNode node = (FTC_FaceNode)ftcnode; FTC_FaceID face_id = (FTC_FaceID)ftcface_id; FTC_Manager manager = (FTC_Manager)ftcmanager; - FT_Error error; - node->face_id = face_id; - error = manager->request_face( face_id, manager->library, manager->request_data, - &node->face ); + &face ); if ( !error ) { /* destroy initial size object; it will be re-created later */ - if ( node->face->size ) - FT_Done_Size( node->face->size ); + if ( face->size ) + FT_Done_Size( face->size ); + + node->face = face; + node->face_id = face_id; } return error; diff --git a/src/cache/ftcmru.c b/src/cache/ftcmru.c index 7171d4d20..dd23d31a3 100644 --- a/src/cache/ftcmru.c +++ b/src/cache/ftcmru.c @@ -249,11 +249,13 @@ if ( list->clazz.node_reset ) { - FTC_MruNode_Up( &list->nodes, node ); - error = list->clazz.node_reset( node, key, list->data ); if ( !error ) - goto Exit; + FTC_MruNode_Up( &list->nodes, node ); + else + node = NULL; + + goto Exit; } FTC_MruNode_Remove( &list->nodes, node );