From 928c008c491c6f36f4c966be887f02caa185cded Mon Sep 17 00:00:00 2001 From: Michal Szczecinski Date: Wed, 14 Jul 2021 08:42:18 +0200 Subject: [PATCH] evas: ++safety Added null pointer dereference checkers for evas mask object. Change-Id: Ie8fef77982bfb8883ec208ab0e0f06b1efe6283c --- src/lib/evas/canvas/evas_clip.c | 1 + src/lib/evas/canvas/evas_object_image.c | 2 ++ src/lib/evas/canvas/evas_object_main.c | 4 ++-- src/lib/evas/canvas/evas_render.c | 7 +++++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/lib/evas/canvas/evas_clip.c b/src/lib/evas/canvas/evas_clip.c index af8d4d2..6402b71 100644 --- a/src/lib/evas/canvas/evas_clip.c +++ b/src/lib/evas/canvas/evas_clip.c @@ -194,6 +194,7 @@ static void _efl_canvas_object_clipper_mask_unset(Evas_Object_Protected_Data *obj) { EVAS_OBJECT_DATA_VALID_CHECK(obj); + if (!obj->mask) return; if (!obj->mask->is_mask) return; if (obj->clip.clipees) return; diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index cff145a..908a810 100755 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -2195,6 +2195,8 @@ evas_object_image_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, v { Evas_Image_Data *o = type_private_data; + if (!obj->mask) return; + /* image is not ready yet, skip rendering. Leave it to next frame */ if (o->preload == EVAS_IMAGE_PRELOADING) return; diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index d81d4d9..55ace3c 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -472,7 +472,7 @@ evas_object_free(Evas_Object_Protected_Data *obj, Eina_Bool clean_layer) map_write->surface = NULL; EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write); } - if (obj->mask->is_mask) + if (obj->mask && obj->mask->is_mask) { EINA_COW_WRITE_BEGIN(evas_object_mask_cow, obj->mask, Evas_Object_Mask_Data, mask) mask->is_mask = EINA_FALSE; @@ -1894,7 +1894,7 @@ _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) } EINA_COW_STATE_WRITE_END(obj, state_write, cur); - if (obj->mask->is_mask) + if (obj->mask && obj->mask->is_mask) { if (obj->mask->surface || obj->mask->w || obj->mask->h || diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 077fcea..2d31ce0 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -405,6 +405,8 @@ _evas_mask_redraw_set(Evas_Public_Data *e EINA_UNUSED, Evas_Object_Protected_Data *clippee; Eina_List *l; + if (!obj->mask) return; + if (!(obj->mask->redraw)) { EINA_COW_WRITE_BEGIN(evas_object_mask_cow, obj->mask, @@ -2352,7 +2354,7 @@ evas_render_mapped(Evas_Public_Data *evas, Evas_Object *eo_obj, { Evas_Object_Protected_Data *mask = obj->clip.mask; - if (obj->mask->surface != surface) + if (obj->mask && obj->mask->surface != surface) { if (proxy_src_clip) { @@ -3645,6 +3647,7 @@ evas_render_updates_internal(Evas *eo_e, ((obj->func->has_opaque_rect) && (obj->func->has_opaque_rect(eo_obj, obj, obj->private_data)))) && evas_object_is_visible(obj) && + (!obj->mask) && (!obj->mask->is_mask) && (!obj->clip.mask) && (!obj->delete_me))) OBJ_ARRAY_PUSH(&e->obscuring_objects, obj); @@ -4490,7 +4493,7 @@ _evas_canvas_render_dump(Eo *eo_e EINA_UNUSED, Evas_Public_Data *evas) } EINA_COW_WRITE_END(evas_object_proxy_cow, obj->proxy, proxy_write); } - if (obj->mask->surface) + if (obj->mask && obj->mask->surface) { EINA_COW_WRITE_BEGIN(evas_object_mask_cow, obj->mask, Evas_Object_Mask_Data, mdata) { -- 2.7.4