Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 21 Jun 2014 09:00:15 -0700
From:      Sean Bruno <sbruno@ignoranthack.me>
To:        hiren panchasara <hiren.panchasara@gmail.com>
Cc:        "freebsd-net@freebsd.org" <net@freebsd.org>
Subject:   Re: getpeername returning ENOTCONN for a connected socket
Message-ID:  <1403366415.39384.11.camel@bruno>
In-Reply-To: <CALCpEUFq1pVBjLjLV%2B88-qnjcKOM6vbw9SjOkhGdFYoT8Qsgcw@mail.gmail.com>
References:  <CALCpEUFq1pVBjLjLV%2B88-qnjcKOM6vbw9SjOkhGdFYoT8Qsgcw@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1403366415.39384.11.camel>