--- src/userauth.c 2012-04-18 23:24:04.000000000 +0300 +++ src/userauth.new.c 2013-04-17 15:51:03.275687538 +0300 @@ -280,9 +280,15 @@ return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block waiting"); } else if (rc) { - session->userauth_pswd_state = libssh2_NB_state_idle; - return _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT, - "Would block waiting"); + if (rc == LIBSSH2_ERROR_SOCKET_DISCONNECT ) { + session->userauth_pswd_state = libssh2_NB_state_idle; + return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_DISCONNECT, + "Connection closed by server"); + } else { + session->userauth_pswd_state = libssh2_NB_state_idle; + return _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT, + "Would block waiting"); + } } if (session->userauth_pswd_data[0] == SSH_MSG_USERAUTH_SUCCESS) {