getpeername returning ENOTCONN for a connected socket
Sean Bruno
sbruno at ignoranthack.me
Sat Jun 21 16:00:17 UTC 2014
On Fri, 2014-06-20 at 16:21 -0700, hiren panchasara wrote:
> Reviving an old thread where Steve found this problem: A call to
> getpeername on a connected tcp socket returns ENOTCONN with no prior
> errors being reported by previous socket calls.
>
> Please look at http://lists.freebsd.org/pipermail/freebsd-net/2011-January/027647.html
> for more details.
>
> Here is a proposed patch derived from
> $src/sys/netsmb/smb_trantcp.c:nbssn_recv()'s way of handling a similar
> situation:
>
> Index: sys/kern/uipc_syscalls.c
> ===================================================================
> --- sys/kern/uipc_syscalls.c (revision 267693)
> +++ sys/kern/uipc_syscalls.c (working copy)
> @@ -1755,6 +1755,12 @@
> if (error != 0)
> return (error);
> so = fp->f_data;
> + if ((so->so_state & (SS_ISDISCONNECTED|SS_ISDISCONNECTING)) ||
> + (so->so_rcv.sb_state & SBS_CANTRCVMORE)) {
> + error = ECONNRESET;
> + goto done;
> + }
> if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0) {
> error = ENOTCONN;
> goto done;
>
> Does this look correct?
>
> cheers,
> Hiren
Has this been tested in "anger" anywhere?
sean
More information about the freebsd-net
mailing list