From e4ecb159e7701fe4b7a3595fcb7541dfb3d3649d Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 18 Mar 2020 12:29:21 -0400 Subject: [PATCH] evas/render: fix log ptr access in render thread when this lock is released, the evas may be immediately freed, leading to invalid access in the log call Reviewed-by: Marcel Hollerbach Differential Revision: https://phab.enlightenment.org/D11536 --- src/lib/evas/canvas/evas_render.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 4738c80480..db9f14bf1f 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -3943,9 +3943,11 @@ evas_render_pipe_wakeup(void *data) Render_Updates *ru; Evas_Public_Data *evas = data; Efl_Canvas_Output *out; + Evas *e; eina_evlog("+render_pipe_wakeup", evas->evas, 0.0, NULL); eina_spinlock_take(&(evas->render.lock)); + e = evas->evas; EINA_LIST_FOREACH(evas->outputs, ll, out) { if (!out->output) continue ; @@ -3967,7 +3969,8 @@ evas_render_pipe_wakeup(void *data) } eina_spinlock_release(&(evas->render.lock)); evas_async_events_put(data, 0, NULL, evas_render_async_wakeup); - eina_evlog("-render_pipe_wakeup", evas->evas, 0.0, NULL); + /* use local pointer to avoid data race with 'evas' deref after releasing lock */ + eina_evlog("-render_pipe_wakeup", e, 0.0, NULL); } EAPI void