Re: [msysGit] Re: [PATCH] compat: Add another rudimentary poll() emulation
- From
- Albert Dvornik <dvornik@gmail.com>
- Date
- May 27, 2010, 14:05 UTC
- Message-ID
- <AANLkTimyFxEYjQLefWvExBarhZAwoXNLDUum2lVj4Q3B@mail.gmail.com>
- In-Reply-To
- <AANLkTikezlVaX8ARkRw8kEk9wL9RL_5I6X3vK83nzFUl@mail.gmail.com>
On Thu, May 27, 2010 at 9:06 AM, Erik Faye-Lund <kusmabite@googlemail.com> wrote: [...]
Show 6 quoted lines
> But perhaps you should include a check along the lines of this:
>
> if (nfds > FD_SETSIZE)
> return errno = EINVAL, error("poll: nfds must be below %d", FD_SETSIZE);
>
> Just so we can know when the code fails :)If you're checking against FD_SETSIZE (which is IMO a good idea), you should consider that (a) on the one system I'm aware of where fd_set doesn't use a bitmap (Windows), FD_SETSIZE is a limit on the number of descriptors added to the set, but (b) on systems where fd_set uses a bitmap (i.e. Linux, perhaps all UNIXes, etc), FD_SETSIZE is a limit on *each descriptor value*. This is also what POSIX says.
So on the latter systems, we want something like this before each FD_SET:
if (ufds[i].fd >= FD_SETSIZE) {
errno = EINVAL;
return error("poll: each fd must be below %d", FD_SETSIZE);
}(The reason to have it in the loop, rather than just check maxfd afterwards, is that FD_SET with an argument that's too big can trash the stack.)
Of course, on Windows this would impose a limitation that all descriptors be < 64, which is probably crazy. Which means that you'd have to actually distinguish the two types. Sigh.
--bert