From bf8f20a3f658048504a478c16565bfe495245168 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 6 Sep 2012 07:34:00 +0000 Subject: [PATCH] fix super hard to reproduce race condition with ecore-con clients SVN revision: 76223 --- legacy/ecore/ChangeLog | 4 ++++ legacy/ecore/src/lib/ecore_con/ecore_con.c | 23 +++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/legacy/ecore/ChangeLog b/legacy/ecore/ChangeLog index 5c5aa50691..8dcfc12697 100644 --- a/legacy/ecore/ChangeLog +++ b/legacy/ecore/ChangeLog @@ -909,3 +909,7 @@ 2012-09-05 Mike Blumenkrantz * Fix crash that could occur in ecore_con_ssl with privkeys and certificates on failure + +2012-09-06 Mike Blumenkrantz + + * Fix race condition in ecore-con where events could sometimes be sent for freed clients diff --git a/legacy/ecore/src/lib/ecore_con/ecore_con.c b/legacy/ecore/src/lib/ecore_con/ecore_con.c index b4e01cbb1d..eb5249d0a3 100644 --- a/legacy/ecore/src/lib/ecore_con/ecore_con.c +++ b/legacy/ecore/src/lib/ecore_con/ecore_con.c @@ -1882,6 +1882,15 @@ _ecore_con_svr_tcp_handler(void *data, error: if (cl->fd_handler) ecore_main_fd_handler_del(cl->fd_handler); if (cl->fd >= 0) close(cl->fd); + { + Ecore_Event *ev; + + EINA_LIST_FREE(cl->event_count, ev) + { + svr->event_count = eina_list_remove(svr->event_count, ev); + ecore_event_del(ev); + } + } free(cl); if (clerr || errno) ecore_con_event_server_error(svr, clerr ?: strerror(errno)); return ECORE_CALLBACK_RENEW; @@ -2545,15 +2554,15 @@ _ecore_con_event_client_error_free(Ecore_Con_Server *svr, Ecore_Con_Event_Client { if (e->client) { - e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e); - if ((!e->client->event_count) && (e->client->delete_me)) - _ecore_con_client_free(e->client); - if (e->client->host_server) + if (eina_list_data_find(svr->clients, e->client)) { - e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e); - if ((!svr->event_count) && (svr->delete_me)) - _ecore_con_server_free(svr); + e->client->event_count = eina_list_remove(e->client->event_count, e); + if ((!e->client->event_count) && (e->client->delete_me)) + _ecore_con_client_free(e->client); } + svr->event_count = eina_list_remove(svr->event_count, e); + if ((!svr->event_count) && (svr->delete_me)) + _ecore_con_server_free(svr); } free(e->error); ecore_con_event_client_error_free(e);