Skip to content
Snippets Groups Projects
Commit b5dd7061 authored by Gregory Nutt's avatar Gregory Nutt
Browse files

poll needs to set POLLNVAL if file descriptor is bad

parent 9d280a58
No related branches found
No related tags found
No related merge requests found
......@@ -4777,3 +4777,5 @@
* net/net_poll.c: When readahead data is availalbe, the network poll
logic should set POLLIN (or POLLRDNORM), not POLLOUT. Max Holtzberg
(2013-5-23)
* fs/fs_poll.c: Actually, it should not ignore invlid descriptors, it
should set the POLLNVAL event and return immediately (2013-5-23).
......@@ -163,17 +163,30 @@ static inline int poll_setup(FAR struct pollfd *fds, nfds_t nfds, sem_t *sem)
for (i = 0; i < nfds; i++)
{
/* Ignore negative descriptors */
/* Setup the poll descriptor */
if (fds[i].fd >= 0)
fds[i].sem = sem;
fds[i].priv = NULL;
/* Check for invalid descriptors */
if (fds[i].fd < 0)
{
/* Setup the poll descriptor */
/* Set POLLNVAL to indicate the invalid fd member */
fds[i].sem = sem;
fds[i].revents = 0;
fds[i].priv = NULL;
fds[i].revents = POLLNVAL;
/* And increment the semaphore so that poll will return
* immediately (but with a successful return value).
*/
sem_post(sem);
}
else
{
/* Set up the poll on this valid file descriptor */
/* Set up the poll */
fds[i].revents = 0;
ret = poll_fdsetup(fds[i].fd, &fds[i], true);
if (ret < 0)
......@@ -219,18 +232,18 @@ static inline int poll_teardown(FAR struct pollfd *fds, nfds_t nfds, int *count)
{
ret = status;
}
}
/* Check if any events were posted */
/* Check if any events were posted */
if (fds[i].revents != 0)
{
(*count)++;
}
if (fds[i].revents != 0)
{
(*count)++;
}
/* Un-initialize the poll structure */
/* Un-initialize the poll structure */
fds[i].sem = NULL;
}
fds[i].sem = NULL;
}
return ret;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment