raster pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=203006799186d47851509514786d05b4ae7fb644
commit 203006799186d47851509514786d05b4ae7fb644 Author: Ryuan Choi <ryuan.c...@samsung.com> Date: Fri Apr 25 10:29:01 2014 +0900 Clear the values of pipe before calling handler. Summary: Applications are stuck when handler of pipe made nested loop. In the nested loop, _ecore_pipe_read() tried to read new data based on previous information which is not cleared yet. Spotted by gyuyoung.kim, sy302.park. Related webkit bug is https://bugs.webkit.org/show_bug.cgi?id=129294 Reviewers: cedric, seoz, raster CC: seoz, cedric Differential Revision: https://phab.enlightenment.org/D790 --- src/lib/ecore/ecore_pipe.c | 44 +++++++++++--------------------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/src/lib/ecore/ecore_pipe.c b/src/lib/ecore/ecore_pipe.c index 705673b..9783c2f 100644 --- a/src/lib/ecore/ecore_pipe.c +++ b/src/lib/ecore/ecore_pipe.c @@ -586,12 +586,22 @@ _ecore_pipe_handler_call(Ecore_Pipe *p, size_t len) { void *data = (void*) p->data; + + // clear all values of pipe first. + p->passed_data = NULL; + p->already_read = 0; + p->len = 0; + p->message++; + if (!p->delete_me) { _ecore_unlock(); p->handler(data, buf, len); _ecore_lock(); } + + // free p->passed_data + free(buf); } static Eina_Bool @@ -634,11 +644,6 @@ _ecore_pipe_read(void *data, { /* no data on first try through means an error */ _ecore_pipe_handler_call(p, NULL, 0); - if (p->passed_data) free(p->passed_data); - p->passed_data = NULL; - p->already_read = 0; - p->len = 0; - p->message++; pipe_close(p->fd_read); p->fd_read = PIPE_FD_INVALID; p->fd_handler = NULL; @@ -673,11 +678,6 @@ _ecore_pipe_read(void *data, if (WSAGetLastError() != WSAEWOULDBLOCK) { _ecore_pipe_handler_call(p, NULL, 0); - if (p->passed_data) free(p->passed_data); - p->passed_data = NULL; - p->already_read = 0; - p->len = 0; - p->message++; pipe_close(p->fd_read); p->fd_read = PIPE_FD_INVALID; p->fd_handler = NULL; @@ -694,12 +694,6 @@ _ecore_pipe_read(void *data, if (p->len == 0) { _ecore_pipe_handler_call(p, NULL, 0); - /* reset all values to 0 */ - if (p->passed_data) free(p->passed_data); - p->passed_data = NULL; - p->already_read = 0; - p->len = 0; - p->message++; _ecore_pipe_unhandle(p); return ECORE_CALLBACK_RENEW; } @@ -713,9 +707,6 @@ _ecore_pipe_read(void *data, { _ecore_pipe_handler_call(p, NULL, 0); /* close the pipe */ - p->already_read = 0; - p->len = 0; - p->message++; pipe_close(p->fd_read); p->fd_read = PIPE_FD_INVALID; p->fd_handler = NULL; @@ -732,15 +723,7 @@ _ecore_pipe_read(void *data, /* catch the non error case first */ /* if we read enough data to finish the message/buffer */ if (ret == (ssize_t)(p->len - p->already_read)) - { - _ecore_pipe_handler_call(p, p->passed_data, p->len); - free(p->passed_data); - /* reset all values to 0 */ - p->passed_data = NULL; - p->already_read = 0; - p->len = 0; - p->message++; - } + _ecore_pipe_handler_call(p, p->passed_data, p->len); else if (ret > 0) { /* more data left to read */ @@ -775,11 +758,6 @@ _ecore_pipe_read(void *data, if (WSAGetLastError() != WSAEWOULDBLOCK) { _ecore_pipe_handler_call(p, NULL, 0); - if (p->passed_data) free(p->passed_data); - p->passed_data = NULL; - p->already_read = 0; - p->len = 0; - p->message++; pipe_close(p->fd_read); p->fd_read = PIPE_FD_INVALID; p->fd_handler = NULL; --