Linux-Hams archive - September 1999: Kernel 2.2.12 select()/accept() broken ?

Kernel 2.2.12 select()/accept() broken ?

Jan Wasserbauer (gge.aafzhucgly@basf-ag.de)
Mon, 6 Sep 1999 00:49:39 +0200


Hi everyone on the list ..

Part of checklogin() function:
...
tv.tv_sec = 0;
tv.tv_usec = 0;

if (select (maxsock + 1, &rfds, NULL, NULL, &tv) <= 0)
return;

for (i = 0; i < listen_sock_num; i++)
{
if (!FD_ISSET (listen_sock[i], &rfds))
continue;

addrlen = sizeof (struct full_sockaddr_ax25);
ret = accept (listen_sock[i], (struct sockaddr *) &newconn, &addrlen);
...

This does work OK with any kernel below 2.2.12.

With 2.2.12 accept() does not correctly fill sockaddr struct
when tv.tv_sec=tv.tv_usec=0 (some binary mess instead of callsigns)
It works when tv is nonzero.

Reffering to select() man page tv=0 should cause select
to check descriptors and exit immediately (and not just
break accept() :) )
To me it seems like kernel bug ..

My system - Slackware 4.0 (gcc2.7.2.3, libc5.4.46)

If this is known bug I hope this at least saves some time
to people wondering why their software doesn't work with 2.2.12.

Bye Jan.