From 21efff6d3eded1dc3e6c46ac6e7ce7b89f227940 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Mon, 5 Aug 2019 18:51:36 +0100 Subject: [PATCH] evas image - eina file - be paranoud about double closes tracking some seemingly not so good asan hits on the eina file where we're accessing an eina file already closed... so be extra paranoid about it and set things to null after free/close... --- src/lib/evas/cache/evas_cache_image.c | 6 +++- src/lib/evas/canvas/evas_object_image.c | 32 ++++++++++++++++--- src/lib/evas/common/evas_image_main.c | 6 +++- .../image_loaders/dds/evas_image_load_dds.c | 2 +- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/lib/evas/cache/evas_cache_image.c b/src/lib/evas/cache/evas_cache_image.c index 593f801efc..ae84db4491 100644 --- a/src/lib/evas/cache/evas_cache_image.c +++ b/src/lib/evas/cache/evas_cache_image.c @@ -181,7 +181,11 @@ _evas_cache_image_entry_delete(Evas_Cache_Image *cache, Image_Entry *ie) FREESTRC(ie->cache_key); FREESTRC(ie->file); FREESTRC(ie->key); - if (ie->f && ie->flags.given_mmap) eina_file_close(ie->f); + if (ie->f && ie->flags.given_mmap) + { + eina_file_close(ie->f); + ie->f = NULL; + } ie->cache = NULL; if ((cache) && (cache->func.surface_delete)) cache->func.surface_delete(ie); diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index 0f2c10aa10..abcfa1729b 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -1711,10 +1711,34 @@ evas_object_image_free(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) Eina_Rectangle *r; /* free obj */ - eina_file_close(o->cur->f); - if (o->cur->key) eina_stringshare_del(o->cur->key); - if (o->cur->source) _evas_image_proxy_unset(eo_obj, obj, o); - if (o->cur->scene) _evas_image_3d_unset(eo_obj, obj, o); + if (o->cur->key) + { + eina_stringshare_del(o->cur->key); + EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write) + state_write->key = NULL; + EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); + } + if (o->cur->source) + { + if (o->cur->source) _evas_image_proxy_unset(eo_obj, obj, o); + EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write) + state_write->source = NULL; + EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); + } + if (o->cur->scene) + { + if (o->cur->scene) _evas_image_3d_unset(eo_obj, obj, o); + EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write) + state_write->scene = NULL; + EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); + } + if (o->cur->f) + { + eina_file_close(o->cur->f); + EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write) + state_write->f = NULL; + EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); + } if (obj->layer && obj->layer->evas) { if (o->engine_data && ENC) diff --git a/src/lib/evas/common/evas_image_main.c b/src/lib/evas/common/evas_image_main.c index a9cee630aa..e42e05d816 100644 --- a/src/lib/evas/common/evas_image_main.c +++ b/src/lib/evas/common/evas_image_main.c @@ -518,7 +518,11 @@ _evas_common_rgba_image_delete(Image_Entry *ie) free(frame); } } - if (ie->f && !ie->flags.given_mmap) eina_file_close(ie->f); + if (ie->f && !ie->flags.given_mmap) + { + eina_file_close(ie->f); + ie->f = NULL; + } eina_freeq_ptr_add(eina_freeq_main_get(), im, free, sizeof(*im)); } diff --git a/src/modules/evas/image_loaders/dds/evas_image_load_dds.c b/src/modules/evas/image_loaders/dds/evas_image_load_dds.c index e77c3e960b..d24707c9ae 100644 --- a/src/modules/evas/image_loaders/dds/evas_image_load_dds.c +++ b/src/modules/evas/image_loaders/dds/evas_image_load_dds.c @@ -145,7 +145,7 @@ evas_image_load_file_close_dds(void *loader_data) { Evas_Loader_Internal *loader = loader_data; - eina_file_close(loader->f); + if (loader->f) eina_file_close(loader->f); free(loader); }