diff --git a/legacy/ecore/ChangeLog b/legacy/ecore/ChangeLog index d0c8610b4a..cd6a8b4975 100644 --- a/legacy/ecore/ChangeLog +++ b/legacy/ecore/ChangeLog @@ -858,3 +858,6 @@ * Fix ecore fork reset function to allow for callbacks to be attached so ecore-evas can reset evas async fd on fork. +2012-08-13 Vincent Torri + + * Fix segmentation fault when fd_set pointers are NULL on Windows diff --git a/legacy/ecore/NEWS b/legacy/ecore/NEWS index 3daccb8c92..3ae7b0c961 100644 --- a/legacy/ecore/NEWS +++ b/legacy/ecore/NEWS @@ -29,6 +29,7 @@ Fixes: - Force cancel of all running Ecore_Thread on shutdown. - Make Ecore_Thread work reliably when called without a running main loop. - Correctly shutdown Ecore_Thread. + - Fix usage of FD_SET and al. when fd_set pointers are NULL (Windows) * ecore_x - Fix unitialized Ecore_X_Atom use. diff --git a/legacy/ecore/src/lib/ecore/ecore_main.c b/legacy/ecore/src/lib/ecore/ecore_main.c index aa9b605385..894ab33fa0 100644 --- a/legacy/ecore/src/lib/ecore/ecore_main.c +++ b/legacy/ecore/src/lib/ecore/ecore_main.c @@ -1941,12 +1941,21 @@ _ecore_main_win32_select(int nfds __UNUSED__, long network_event; network_event = 0; - if (FD_ISSET(fdh->fd, readfds)) - network_event |= FD_READ; - if (FD_ISSET(fdh->fd, writefds)) - network_event |= FD_WRITE; - if (FD_ISSET(fdh->fd, exceptfds)) - network_event |= FD_OOB; + if (readfds) + { + if (FD_ISSET(fdh->fd, readfds)) + network_event |= FD_READ; + } + if (writefds) + { + if (FD_ISSET(fdh->fd, writefds)) + network_event |= FD_WRITE; + } + if (exceptfds) + { + if (FD_ISSET(fdh->fd, exceptfds)) + network_event |= FD_OOB; + } if (network_event) { @@ -1986,9 +1995,12 @@ _ecore_main_win32_select(int nfds __UNUSED__, result = MsgWaitForMultipleObjects(objects_nbr, (const HANDLE *)objects, EINA_FALSE, timeout, QS_ALLINPUT); - FD_ZERO(readfds); - FD_ZERO(writefds); - FD_ZERO(exceptfds); + if (readfds) + FD_ZERO(readfds); + if (writefds) + FD_ZERO(writefds); + if (exceptfds) + FD_ZERO(exceptfds); /* The result tells us the type of event we have. */ if (result == WAIT_FAILED) @@ -2021,11 +2033,11 @@ _ecore_main_win32_select(int nfds __UNUSED__, WSAEnumNetworkEvents(sockets[result], objects[result], &network_event); - if (network_event.lNetworkEvents & FD_READ) + if ((network_event.lNetworkEvents & FD_READ) && readfds) FD_SET(sockets[result], readfds); - if (network_event.lNetworkEvents & FD_WRITE) + if ((network_event.lNetworkEvents & FD_WRITE) && writefds) FD_SET(sockets[result], writefds); - if (network_event.lNetworkEvents & FD_OOB) + if ((network_event.lNetworkEvents & FD_OOB) && exceptfds) FD_SET(sockets[result], exceptfds); res = 1;