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.
This commit is contained in:
Markus Armbruster 2009-02-02 08:08:38 +01:00
parent cd740c1b63
commit 48cec49fbf
2 changed files with 11 additions and 25 deletions

View file

@ -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:

View file

@ -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;