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); }