On Thu, Jun 6, 2013 at 6:53 PM, Rafael Antognolli - Enlightenment Git
<no-re...@enlightenment.org> wrote:
> antognolli pushed a commit to branch master.
>
> commit 4b5d52fca12b74871f14883566b29ef274eaf860
> Author: Rafael Antognolli <rafael.antogno...@intel.com>
> Date:   Thu Jun 6 18:35:12 2013 -0300
>
>     evas/callbacks: Prevent post_event_callback_call recursion.
>
>     If this function is called recursively, it will free the list of post
>     callbacks before the list stops being used, which will cause a segfault.
>
>     The only place where this seems to happen is on
>     https://phab.enlightenment.org/T124, probably due to the extensive mouse
>     events which are launched in an unexpected way.
>
>     This bug started happening after commit
>     164cc07237395f8fe6efa465e4f0c0c4863f78ed, where the
>     _elm_scroll_page_x_get() started being called by a post_event callback,
>     and forcing an edje recalc. This recalc triggered another post_event
>     callback, thus causing the mentioned segfault.
>
>     If there's a better way to prevent this from happening, please change
>     the mentioned code.
> ---
>  src/lib/evas/canvas/evas_callbacks.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/src/lib/evas/canvas/evas_callbacks.c 
> b/src/lib/evas/canvas/evas_callbacks.c
> index 4d1c16d..b85cc39 100644
> --- a/src/lib/evas/canvas/evas_callbacks.c
> +++ b/src/lib/evas/canvas/evas_callbacks.c
> @@ -152,9 +152,12 @@ _evas_post_event_callback_call(Evas *eo_e, 
> Evas_Public_Data *e)
>  {
>     Evas_Post_Callback *pc;
>     int skip = 0;
> +   static int first_run = 1; // FIXME: This is a workaround to prevent this
> +                             // function from being called recursively.
>
> -   if (e->delete_me) return;
> +   if (e->delete_me || (!first_run)) return;
>     _evas_walk(e);
> +   first_run = 0;
>     EINA_LIST_FREE(e->post_events, pc)
>       {
>          if ((!skip) && (!e->delete_me) && (!pc->delete_me))
> @@ -163,6 +166,7 @@ _evas_post_event_callback_call(Evas *eo_e, 
> Evas_Public_Data *e)
>            }
>          EVAS_MEMPOOL_FREE(_mp_pc, pc);
>       }
> +   first_run = 1;
>     _evas_unwalk(e);
>  }

Can someone else take a look at this "fix", and see if there's a
better solution?

Regards,
--
Rafael Antognolli

------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. A cloud service to automate IT design, transition and operations
2. Dashboards that offer high-level views of enterprise services
3. A single system of record for all IT processes
http://p.sf.net/sfu/servicenow-d2d-j
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to