Cedric Bail On Nov 3, 2013 9:22 PM, "Carsten Haitzler" <ras...@rasterman.com> wrote: > > raster pushed a commit to branch master. > > http://git.enlightenment.org/core/efl.git/commit/?id=eb6af1f1ff7ee069eff8bab13c0eed5010ef5660 > > commit eb6af1f1ff7ee069eff8bab13c0eed5010ef5660 > Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> > Date: Sun Nov 3 21:43:11 2013 +0900 > > evas - clip shutdown fix to avoid invalid mem accesses > > many valgrind complaints on e shutdown are there regarding accessing > cow sections, lists and object elements during shutdown. this plugs > theses little holes to avoid the invalid accesses and thus avoids > potential crashes.
Just thinking here, but we could make cow free set the pointer to the read-only always valid object? That should keep the code cleaner and less error prone, I think. > --- > src/lib/evas/canvas/evas_clip.c | 20 ++++++++++++-------- > src/lib/evas/canvas/evas_object_main.c | 25 ++++++++++++++++++++++--- > 2 files changed, 34 insertions(+), 11 deletions(-) > > diff --git a/src/lib/evas/canvas/evas_clip.c b/src/lib/evas/canvas/evas_clip.c > index 76cddc0..5dfbc48 100644 > --- a/src/lib/evas/canvas/evas_clip.c > +++ b/src/lib/evas/canvas/evas_clip.c > @@ -369,6 +369,7 @@ _clip_unset(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED) > { > Evas_Object_Protected_Data *obj = _pd; > > + if (!obj->cur) return; > if (!obj->cur->clipper) return; > > obj->clip.cache_clipees_answer = eina_list_free(obj->clip.cache_clipees_answer); > @@ -386,7 +387,7 @@ _clip_unset(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED) > { > EINA_COW_STATE_WRITE_BEGIN(obj->cur->clipper, state_write, cur) > { > - state_write->have_clipees = 0; > + if (state_write) state_write->have_clipees = 0; > } > EINA_COW_STATE_WRITE_END(obj->cur->clipper, state_write, cur); > > @@ -417,14 +418,17 @@ _clip_unset(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED) > if ((!obj->is_smart) && > (!((obj->map->cur.map) && (obj->map->cur.usemap)))) > { > - if (evas_object_is_in_output_rect(eo_obj, obj, > + if (obj->cur) > + { > + if (evas_object_is_in_output_rect(eo_obj, obj, > + obj->layer->evas->pointer.x, > + obj->layer->evas->pointer.y, 1, 1)) > + evas_event_feed_mouse_move(obj->layer->evas->evas, > obj->layer->evas->pointer.x, > - obj->layer->evas->pointer.y, 1, 1)) > - evas_event_feed_mouse_move(obj->layer->evas->evas, > - obj->layer->evas->pointer.x, > - obj->layer->evas->pointer.y, > - obj->layer->evas->last_timestamp, > - NULL); > + obj->layer->evas->pointer.y, > + obj->layer->evas->last_timestamp, > + NULL); > + } > } > evas_object_clip_across_check(eo_obj, obj); > } > diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c > index 27fc7ad..c779f2d 100644 > --- a/src/lib/evas/canvas/evas_object_main.c > +++ b/src/lib/evas/canvas/evas_object_main.c > @@ -141,6 +141,7 @@ void > evas_object_free(Evas_Object *eo_obj, int clean_layer) > { > Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, MY_CLASS); > + Evas_Object *eo_obj2; > if (!obj) return; > obj->clean_layer = clean_layer; > > @@ -171,8 +172,21 @@ evas_object_free(Evas_Object *eo_obj, int clean_layer) > obj->func->free(eo_obj, obj, obj->private_data); > } > if (!was_smart_child) evas_object_release(eo_obj, obj, obj->clean_layer); > - if (obj->clip.clipees) > - eina_list_free(obj->clip.clipees); > + EINA_LIST_FREE(obj->clip.clipees, eo_obj2) > + { > + Evas_Object_Protected_Data *obj2 = > + eo_data_scope_get(eo_obj2, MY_CLASS); > + if ((obj2) && (obj2->cur)) > + { > + EINA_COW_STATE_WRITE_BEGIN(obj2, state_write, cur) > + { > + state_write->clipper = NULL; > + } > + EINA_COW_STATE_WRITE_END(obj2, state_write, cur); > + } > + } > +// if (obj->clip.clipees) > +// obj->clip.clipees = eina_list_free(obj->clip.clipees); > obj->clip.cache_clipees_answer = eina_list_free(obj->clip.cache_clipees_answer); > evas_object_clip_changes_clean(eo_obj); > evas_object_event_callback_all_del(eo_obj); > @@ -188,12 +202,17 @@ evas_object_free(Evas_Object *eo_obj, int clean_layer) > } > if (obj->size_hints) > { > - EVAS_MEMPOOL_FREE(_mp_sh, obj->size_hints); > + EVAS_MEMPOOL_FREE(_mp_sh, obj->size_hints); > + obj->size_hints = NULL; > } > eina_cow_free(evas_object_proxy_cow, obj->proxy); > eina_cow_free(evas_object_map_cow, obj->map); > eina_cow_free(evas_object_state_cow, obj->cur); > eina_cow_free(evas_object_state_cow, obj->prev); > + obj->cur = NULL; > + obj->prev = NULL; > + obj->map = NULL; > + obj->proxy = NULL; > eo_data_unref(eo_obj, obj->private_data); > obj->private_data = NULL; > eo_manual_free(eo_obj); > > -- > > > ------------------------------------------------------------------------------ Android is increasing in popularity, but the open development platform that developers love is also attractive to malware creators. Download this white paper to learn more about secure code signing practices that can help keep Android apps secure. http://pubads.g.doubleclick.net/gampad/clk?id=65839951&iu=/4140/ostg.clktrk _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel