From: discomfitor Date: Mon, 20 Sep 2010 19:31:11 +0000 (+0000) Subject: add cl->client_count member to prevent segv when counting a list that is actually... X-Git-Tag: build/2012-07-04.173327~1775 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d5c9597b62c26e9f5562d36cd392c268ff86cb16;p=profile%2Fivi%2Fecore.git add cl->client_count member to prevent segv when counting a list that is actually null but hasn't been nulled git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@52503 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- diff --git a/src/lib/ecore_con/ecore_con.c b/src/lib/ecore_con/ecore_con.c index d60dda2..e262bb9 100644 --- a/src/lib/ecore_con/ecore_con.c +++ b/src/lib/ecore_con/ecore_con.c @@ -822,7 +822,12 @@ ecore_con_client_del(Ecore_Con_Client *cl) else { if (cl->host_server) - cl->host_server->clients = eina_list_remove(cl->host_server->clients, cl); + { + cl->host_server->clients = eina_list_remove(cl->host_server->clients, cl); + if (!(--cl->host_server->client_count)) + /* avoid segv from nonnull list */ + cl->host_server->clients = NULL; + } _ecore_con_client_free(cl); } @@ -1497,7 +1502,7 @@ _ecore_con_svr_tcp_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) return ECORE_CALLBACK_RENEW; if ((svr->client_limit >= 0) && (!svr->reject_excess_clients) && - (eina_list_count(svr->clients) >= (unsigned int)svr->client_limit)) + (svr->client_count >= (unsigned int)svr->client_limit)) return ECORE_CALLBACK_RENEW; /* a new client */ @@ -1511,7 +1516,7 @@ _ecore_con_svr_tcp_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) return ECORE_CALLBACK_RENEW; if ((svr->client_limit >= 0) && (svr->reject_excess_clients) && - (eina_list_count(svr->clients) >= (unsigned int)svr->client_limit)) + (svr->client_count >= (unsigned int)svr->client_limit)) goto error; cl = calloc(1, sizeof(Ecore_Con_Client)); @@ -1533,6 +1538,7 @@ _ecore_con_svr_tcp_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) _ecore_con_svr_cl_handler, cl, NULL, NULL); ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT); svr->clients = eina_list_append(svr->clients, cl); + svr->client_count++; if (!svr->path) cl->ip = _ecore_con_pretty_ip((struct sockaddr *)&incoming, size_in); @@ -1768,6 +1774,7 @@ _ecore_con_svr_udp_handler(void *data, Ecore_Fd_Handler *fd_handler) memcpy(cl->client_addr, &client_addr, client_addr_len); ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT); svr->clients = eina_list_append(svr->clients, cl); + svr->client_count++; cl->ip = _ecore_con_pretty_ip(cl->client_addr, cl->client_addr_len); diff --git a/src/lib/ecore_con/ecore_con_private.h b/src/lib/ecore_con/ecore_con_private.h index d903326..ce31144 100644 --- a/src/lib/ecore_con/ecore_con_private.h +++ b/src/lib/ecore_con/ecore_con_private.h @@ -110,6 +110,7 @@ struct _Ecore_Con_Server void *data; Ecore_Fd_Handler *fd_handler; Eina_List *clients; + unsigned int client_count; int write_buf_size; int write_buf_offset; unsigned char *write_buf;