From: Markus Armbruster Date: Mon, 2 Feb 2009 07:08:38 +0000 (+0100) Subject: Fix empth_select() for funny flag arguments X-Git-Tag: v4.3.20~49 X-Git-Url: http://git.pond.sub.org/?p=empserver;a=commitdiff_plain;h=48cec49fbfb44a7b4416d6672df3bbd05ab5c7c5 Fix empth_select() for funny flag arguments EMPTH_POSIX and EMPTH_W32 implementations rejected values other than a single flag. Such values aren't used now, but it violates the contract all the same. --- diff --git a/src/lib/empthread/ntthread.c b/src/lib/empthread/ntthread.c index 1279f732a..56f6db0a7 100644 --- a/src/lib/empthread/ntthread.c +++ b/src/lib/empthread/ntthread.c @@ -565,6 +565,7 @@ empth_select(int fd, int flags, struct timeval *timeout) { int handle; WSAEVENT hEventObject[2]; + long events; DWORD result, msec; empth_t *pThread = TlsGetValue(dwTLSIndex); int res; @@ -579,21 +580,18 @@ empth_select(int fd, int flags, struct timeval *timeout) handle = posix_fd2socket(fd); CANT_HAPPEN(handle < 0); - if (flags == EMPTH_FD_READ) - WSAEventSelect(handle, hEventObject[0], FD_READ | FD_ACCEPT | FD_CLOSE); - else if (flags == EMPTH_FD_WRITE) - WSAEventSelect(handle, hEventObject[0], FD_WRITE | FD_CLOSE); - else { - logerror("bad flag %d passed to empth_select", flags); - empth_exit(); - } + events = 0; + if (flags & EMPTH_FD_READ) + events |= FD_READ | FD_ACCEPT | FD_CLOSE; + if (flags & EMPTH_FD_WRITE) + events |= FD_WRITE | FD_CLOSE; + WSAEventSelect(handle, hEventObject[0], events); if (timeout) msec = timeout->tv_sec * 1000L + timeout->tv_usec / 1000L; else msec = WSA_INFINITE; - result = WSAWaitForMultipleEvents(2, hEventObject, FALSE, msec, - FALSE); + result = WSAWaitForMultipleEvents(2, hEventObject, FALSE, msec, FALSE); switch (result) { case WSA_WAIT_TIMEOUT: diff --git a/src/lib/empthread/pthread.c b/src/lib/empthread/pthread.c index 0f421ce95..7df1934d7 100644 --- a/src/lib/empthread/pthread.c +++ b/src/lib/empthread/pthread.c @@ -299,25 +299,14 @@ empth_select(int fd, int flags, struct timeval *timeout) int res = 0; pthread_mutex_unlock(&mtx_ctxsw); - empth_status("%s select on %d", - flags == EMPTH_FD_READ ? "read" : "write", fd); + empth_status("select on %d for %d", fd, flags); FD_ZERO(&readmask); FD_ZERO(&writemask); - - switch (flags) { - case EMPTH_FD_READ: + if (flags & EMPTH_FD_READ) FD_SET(fd, &readmask); - break; - case EMPTH_FD_WRITE: + if (flags & EMPTH_FD_WRITE) FD_SET(fd, &writemask); - break; - default: - CANT_REACH(); - errno = EINVAL; - res = -1; - goto done; - } if (timeout) { tv = *timeout; @@ -342,7 +331,6 @@ empth_select(int fd, int flags, struct timeval *timeout) res = 1; } -done: pthread_mutex_lock(&mtx_ctxsw); empth_restorectx(); return res;