Hi readers of linux-kernel and glibc maintainers,
while hacking on a network application I found following oddity:
poll(pds,nfds,timeout) called with one of the file descriptors listed in
pds being invalid always does return nfds.
Output of appended sample code:
poll returned 2
revent[0]: 0
revent[1]: 32
According to IEEE Std 1003.1, 2003 Edition, the return value should have
been 1 in the above sample.
The kernel is 2.4.20 (debian 2.4.20-3-686). After a short look at the
code for sys_poll I am certain the problem is originated within the
kernel.
Any suggestions which actions to take?
Michael
Simple sample code demonstrating the problem:
#include <stdio.h>
#include <sys/poll.h>
struct pollfd fds[] = {
{ 0, POLLIN, 0 },
{ 110, POLLIN, 0}
};
int main(void)
{
int r = poll(fds, sizeof fds / sizeof fds[0], -1);
if ( r < 0 )
perror("poll");
else
printf("poll returned %d\n");
for ( r=0; r < sizeof fds / sizeof fds[0]; r++ )
printf("revent[%d]: %hd\n", r, fds[r].revents);
return 0;
}
--
Linux@TekXpress
http://www-users.rwth-aachen.de/Michael.Mueller4/tekxp/tekxp.html
Hi,
I wrote:
> The kernel is 2.4.20 (debian 2.4.20-3-686). After a short look at the
> code for sys_poll I am certain the problem is originated within the
> kernel.
I should have been more carefully about locating the source. After
trying strace, I know the kernel is not the source of the problem:
poll([{fd=0, events=POLLIN}, {fd=110, events=POLLIN, revents=POLLNVAL}],
2, -1) = 1
sorry for bothering you. I am going to file a bug for the glibc instead
now.
Michael
--
Linux@TekXpress
http://www-users.rwth-aachen.de/Michael.Mueller4/tekxp/tekxp.html
[email protected] (Michael Mueller) writes:
> Hi readers of linux-kernel and glibc maintainers,
>
> while hacking on a network application I found following oddity:
>
> poll(pds,nfds,timeout) called with one of the file descriptors listed in
> pds being invalid always does return nfds.
[snip .. ]
> Simple sample code demonstrating the problem:
When writing code, always compile with at least -Wall -W
>
> #include <stdio.h>
> #include <sys/poll.h>
>
> struct pollfd fds[] = {
> { 0, POLLIN, 0 },
> { 110, POLLIN, 0}
> };
>
> int main(void)
> {
> int r = poll(fds, sizeof fds / sizeof fds[0], -1);
> if ( r < 0 )
> perror("poll");
> else
> printf("poll returned %d\n");
printf("poll returned %d\n", r);
Is probably what you want.
>
> for ( r=0; r < sizeof fds / sizeof fds[0]; r++ )
> printf("revent[%d]: %hd\n", r, fds[r].revents);
>
> return 0;
> }
--
James Antill -- [email protected]
Need an efficent and powerful string library for C?
http://www.and.org/vstr/