Skip to contentSkip to conversation

[2.4] Inconsistency in poll(2)

DISCUSSION Michael Mueller 2 participants 3 messages Jul 16, 2003 – Jul 18, 2003

lore
Share & tools
lore
#0 lore raw

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;
}
Signature · 2 lines
Linux@TekXpress
http://www-users.rwth-aachen.de/Michael.Mueller4/tekxp/tekxp.html
#1 lore raw

Hi,

Quoted 3 lines · 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

Signature · 2 lines
Linux@TekXpress
http://www-users.rwth-aachen.de/Michael.Mueller4/tekxp/tekxp.html
#2 lore raw
In reply to Michael Mueller
Quoted 6 lines · [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 .. ]

Quoted 1 line

Simple sample code demonstrating the problem:

When writing code, always compile with at least -Wall -W

Quoted 9 lines

#include <stdio.h>
#include <sys/poll.h>

struct pollfd fds[] = {
{ 0, POLLIN, 0 },
{ 110, POLLIN, 0}
};

Quoted 7 lines

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.

Quoted 6 lines
	for ( r=0; r < sizeof fds / sizeof fds[0]; r++ )
		printf("revent[%d]: %hd\n", r, fds[r].revents);

	return 0;
}
Signature · 3 lines
James Antill -- [email protected]
Need an efficent and powerful string library for C?
http://www.and.org/vstr/