getpeername returning ENOTCONN for a connected socket
hiren panchasara
hiren.panchasara at gmail.com
Fri Jun 20 23:21:04 UTC 2014
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
More information about the freebsd-net
mailing list