[PATCH] sendfile erroniously returns ENOTCONN.

David G. Lawrence dg at dglawrence.com
Fri Jan 2 21:41:11 PST 2004


> sendfile(2) returns ENOTCONN when the remote side has disconnected instead
> of EPIPE.  Can this fix be applied?  Is there a reason for it being the
> way it is?  I know EPIPE can cause SIGPIPE which can cause problems, but
> the error here is incorrect, and considering that the manpage mentions
> EPIPE as a possible error... is this perhaps due to a change in the
> socket flags API?  I know the problem is on 4.x and 5.x.
> 
> Index: uipc_syscalls.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/kern/uipc_syscalls.c,v
> retrieving revision 1.162
> diff -u -r1.162 uipc_syscalls.c
> --- uipc_syscalls.c	28 Dec 2003 08:57:08 -0000	1.162
> +++ uipc_syscalls.c	2 Jan 2004 21:56:10 -0000
> @@ -1697,10 +1697,6 @@
>  		error = EINVAL;
>  		goto done;
>  	}
> -	if ((so->so_state & SS_ISCONNECTED) == 0) {
> -		error = ENOTCONN;
> -		goto done;
> -	}
>  	if (uap->offset < 0) {
>  		error = EINVAL;
>  		goto done;

   sendfile(8) tries to maintain compatibility with sosend as much as is
reasonable. ENOTCONN is the appropriate error to return if the socket
isn't connected. sosend checks SS_CANTSENDMORE prior to the check for
SS_ISCONNECTED, however, and returns EPIPE in that case. Perhaps sendfile
should be changed to do the same (just a though - I'm not proposing
that this be done).
   Removing the check entirely seems clearly wrong, however.

-DG

David G. Lawrence
President
Download Technologies, Inc. - http://www.downloadtech.com - (866) 399 8500
TeraSolutions, Inc. - http://www.terasolutions.com - (888) 346 7175
The FreeBSD Project - http://www.freebsd.org
Pave the road of life with opportunities.


More information about the freebsd-hackers mailing list