diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2019-08-05 18:51:36 +0100 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2019-08-05 18:59:33 +0100 |
commit | 21efff6d3eded1dc3e6c46ac6e7ce7b89f227940 (patch) | |
tree | 937c734369b1eefb0f41475019291e85f55b2445 | |
parent | c56791180d4860d710dfe89d2c568ab65bd3fef2 (diff) | |
download | efl-21efff6d3eded1dc3e6c46ac6e7ce7b89f227940.tar.gz |
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...
-rw-r--r-- | src/lib/evas/cache/evas_cache_image.c | 6 | ||||
-rw-r--r-- | src/lib/evas/canvas/evas_object_image.c | 32 | ||||
-rw-r--r-- | src/lib/evas/common/evas_image_main.c | 6 | ||||
-rw-r--r-- | src/modules/evas/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); } |