Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 Jun 2014 16:21:03 -0700
From:      hiren panchasara <hiren.panchasara@gmail.com>
To:        "freebsd-net@freebsd.org" <net@freebsd.org>
Subject:   getpeername returning ENOTCONN for a connected socket
Message-ID:  <CALCpEUFq1pVBjLjLV%2B88-qnjcKOM6vbw9SjOkhGdFYoT8Qsgcw@mail.gmail.com>

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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CALCpEUFq1pVBjLjLV%2B88-qnjcKOM6vbw9SjOkhGdFYoT8Qsgcw>