From e8edfef977168d2340a86953161ff56376fbcb75 Mon Sep 17 00:00:00 2001 From: sachiel Date: Tue, 17 Jul 2012 14:23:54 +0000 Subject: [PATCH] Avoid calling the requets callbacks if the entry was freed git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@73989 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/bin/evas_cserve2_requests.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/bin/evas_cserve2_requests.c b/src/bin/evas_cserve2_requests.c index 556d8a4..9fd789f 100644 --- a/src/bin/evas_cserve2_requests.c +++ b/src/bin/evas_cserve2_requests.c @@ -76,6 +76,7 @@ struct _Slave_Request Slave_Request *dependency; Eina_List *dependents; /* list of requests that depend on this one finishing */ Eina_Bool locked : 1; /* locked waiting for a dependency request to finish */ + Eina_Bool cancelled : 1; }; struct _Waiter @@ -247,7 +248,8 @@ cserve2_request_cancel(Slave_Request *req, Client *client, Error_Type err) free(req); } - + else if (!req->waiters) + req->cancelled = EINA_TRUE; } void @@ -271,7 +273,10 @@ cserve2_request_cancel_all(Slave_Request *req, Error_Type err) _request_dependents_cancel(req, err); if (req->processing) - return; + { + req->cancelled = EINA_TRUE; + return; + } if (req->dependency) req->dependency->dependents = eina_list_remove( @@ -329,6 +334,9 @@ _slave_read_cb(Slave *s __UNUSED__, Slave_Command cmd, void *msg, void *data) Msg_Base *resp = NULL; int resp_size; + if (req->cancelled) + goto free_it; + if (cmd == ERROR) { Error_Type *err = msg; @@ -355,7 +363,9 @@ _slave_read_cb(Slave *s __UNUSED__, Slave_Command cmd, void *msg, void *data) free(resp); +free_it: req->funcs->msg_free(req->msg, req->data); + // FIXME: We shouldn't free this message directly, it must be freed by a // callback. free(msg); -- 2.7.4