Synopsis: send(), sendto() and sendmsg() are not correct in libc_r
Arrival-Date: Wed Mar 15 11:10:21 GMT 2006
Originator: Sven Berkvens-Matthijsse
Release: FreeBSD 4.10-STABLE i386
ilse media BV
System: FreeBSD serv7.ilse.net 4.10-STABLE FreeBSD 4.10-STABLE #23: Wed Aug 4 15:18:52 CEST 2004 ro...@tango.ilse.net:/usr/obj/usr/src/sys/BAROQUE i386
send(), sendto() and sendmsg() can return prematurely in the libc_r
implementation. If the socket has space available, but not enough to
accommodate the whole data block at once, the kernel's sendto() will
return with a premature byte count, because all the sockets are always
put into nonblocking mode. However, unlike write(), which does
implement this correctly, the implementation of sendto() and co do not
check for this condition if the thread's notion of the socket was
non-blocking. Instead, it just returns the permature bytecount instead
of starting another sendto()/sendmsg() to complete the action (and
possibly putting the thread to sleep until poll() says it's okay to
try again), like a non-blocking version should.
sendto() using a socket and try to write 1 MB of data, for example.
Working on this one... will post a patch when available.