diff --git a/src/sys/kern/uipc_socket.c b/src/sys/kern/uipc_socket.c --- a/src/sys/kern/uipc_socket.c +++ b/src/sys/kern/uipc_socket.c @@ -1088,14 +1088,6 @@ CURVNET_SET(so->so_vnet); funsetown(&so->so_sigio); if (so->so_state & SS_ISCONNECTED) { - if ((so->so_state & SS_ISDISCONNECTING) == 0) { - error = sodisconnect(so); - if (error) { - if (error == ENOTCONN) - error = 0; - goto drop; - } - } if (so->so_options & SO_LINGER) { if ((so->so_state & SS_ISDISCONNECTING) && (so->so_state & SS_NBIO)) @@ -1108,6 +1100,15 @@ break; } } + /*actual disconnect should do after SO_LINGER option process*/ + if ((so->so_state & SS_ISDISCONNECTING) == 0) { + error = sodisconnect(so); + if (error) { + if (error == ENOTCONN) + error = 0; + goto drop; + } + } } drop: