mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +00:00
Fix unexpected network error 5000
[originally from svn r286]
This commit is contained in:
parent
edf8b22b98
commit
b51c18f24c
17
raw.c
17
raw.c
@ -150,14 +150,22 @@ static int raw_msg (WPARAM wParam, LPARAM lParam) {
|
|||||||
int ret;
|
int ret;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
|
||||||
if (s == INVALID_SOCKET) /* how the hell did we get here?! */
|
/*
|
||||||
return -5000;
|
* Because reading less than the whole of the available pending
|
||||||
|
* data can generate an FD_READ event, we need to allow for the
|
||||||
|
* possibility that FD_READ may arrive with FD_CLOSE already in
|
||||||
|
* the queue; so it's possible that we can get here even with s
|
||||||
|
* invalid. If so, we return 1 and don't worry about it.
|
||||||
|
*/
|
||||||
|
if (s == INVALID_SOCKET)
|
||||||
|
return 1;
|
||||||
|
|
||||||
if (WSAGETSELECTERROR(lParam) != 0)
|
if (WSAGETSELECTERROR(lParam) != 0)
|
||||||
return -WSAGETSELECTERROR(lParam);
|
return -WSAGETSELECTERROR(lParam);
|
||||||
|
|
||||||
switch (WSAGETSELECTEVENT(lParam)) {
|
switch (WSAGETSELECTEVENT(lParam)) {
|
||||||
case FD_READ:
|
case FD_READ:
|
||||||
|
case FD_CLOSE:
|
||||||
ret = recv(s, buf, sizeof(buf), 0);
|
ret = recv(s, buf, sizeof(buf), 0);
|
||||||
if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
|
if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
|
||||||
return 1;
|
return 1;
|
||||||
@ -165,7 +173,7 @@ static int raw_msg (WPARAM wParam, LPARAM lParam) {
|
|||||||
return -10000-WSAGetLastError();
|
return -10000-WSAGetLastError();
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
s = INVALID_SOCKET;
|
s = INVALID_SOCKET;
|
||||||
return 0; /* can't happen, in theory */
|
return 0;
|
||||||
}
|
}
|
||||||
c_write( buf, ret );
|
c_write( buf, ret );
|
||||||
return 1;
|
return 1;
|
||||||
@ -184,9 +192,6 @@ static int raw_msg (WPARAM wParam, LPARAM lParam) {
|
|||||||
if (outbuf_head != outbuf_reap)
|
if (outbuf_head != outbuf_reap)
|
||||||
try_write();
|
try_write();
|
||||||
return 1;
|
return 1;
|
||||||
case FD_CLOSE:
|
|
||||||
s = INVALID_SOCKET;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return 1; /* shouldn't happen, but WTF */
|
return 1; /* shouldn't happen, but WTF */
|
||||||
}
|
}
|
||||||
|
18
ssh.c
18
ssh.c
@ -772,14 +772,22 @@ static int ssh_msg (WPARAM wParam, LPARAM lParam) {
|
|||||||
int ret;
|
int ret;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
|
||||||
if (s == INVALID_SOCKET) /* how the hell did we get here?! */
|
/*
|
||||||
return -5000;
|
* Because reading less than the whole of the available pending
|
||||||
|
* data can generate an FD_READ event, we need to allow for the
|
||||||
|
* possibility that FD_READ may arrive with FD_CLOSE already in
|
||||||
|
* the queue; so it's possible that we can get here even with s
|
||||||
|
* invalid. If so, we return 1 and don't worry about it.
|
||||||
|
*/
|
||||||
|
if (s == INVALID_SOCKET)
|
||||||
|
return 1;
|
||||||
|
|
||||||
if (WSAGETSELECTERROR(lParam) != 0)
|
if (WSAGETSELECTERROR(lParam) != 0)
|
||||||
return -WSAGETSELECTERROR(lParam);
|
return -WSAGETSELECTERROR(lParam);
|
||||||
|
|
||||||
switch (WSAGETSELECTEVENT(lParam)) {
|
switch (WSAGETSELECTEVENT(lParam)) {
|
||||||
case FD_READ:
|
case FD_READ:
|
||||||
|
case FD_CLOSE:
|
||||||
ret = recv(s, buf, sizeof(buf), 0);
|
ret = recv(s, buf, sizeof(buf), 0);
|
||||||
if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
|
if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
|
||||||
return 1;
|
return 1;
|
||||||
@ -787,14 +795,10 @@ static int ssh_msg (WPARAM wParam, LPARAM lParam) {
|
|||||||
return -10000-WSAGetLastError();
|
return -10000-WSAGetLastError();
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
s = INVALID_SOCKET;
|
s = INVALID_SOCKET;
|
||||||
return 0; /* can't happen, in theory */
|
return 0;
|
||||||
}
|
}
|
||||||
ssh_gotdata (buf, ret);
|
ssh_gotdata (buf, ret);
|
||||||
return 1;
|
return 1;
|
||||||
case FD_CLOSE:
|
|
||||||
s = INVALID_SOCKET;
|
|
||||||
ssh_state = SSH_STATE_CLOSED;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return 1; /* shouldn't happen, but WTF */
|
return 1; /* shouldn't happen, but WTF */
|
||||||
}
|
}
|
||||||
|
17
telnet.c
17
telnet.c
@ -586,14 +586,22 @@ static int telnet_msg (WPARAM wParam, LPARAM lParam) {
|
|||||||
int ret;
|
int ret;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
|
||||||
if (s == INVALID_SOCKET) /* how the hell did we get here?! */
|
/*
|
||||||
return -5000;
|
* Because reading less than the whole of the available pending
|
||||||
|
* data can generate an FD_READ event, we need to allow for the
|
||||||
|
* possibility that FD_READ may arrive with FD_CLOSE already in
|
||||||
|
* the queue; so it's possible that we can get here even with s
|
||||||
|
* invalid. If so, we return 1 and don't worry about it.
|
||||||
|
*/
|
||||||
|
if (s == INVALID_SOCKET)
|
||||||
|
return 1;
|
||||||
|
|
||||||
if (WSAGETSELECTERROR(lParam) != 0)
|
if (WSAGETSELECTERROR(lParam) != 0)
|
||||||
return -WSAGETSELECTERROR(lParam);
|
return -WSAGETSELECTERROR(lParam);
|
||||||
|
|
||||||
switch (WSAGETSELECTEVENT(lParam)) {
|
switch (WSAGETSELECTEVENT(lParam)) {
|
||||||
case FD_READ:
|
case FD_READ:
|
||||||
|
case FD_CLOSE:
|
||||||
ret = recv(s, buf, sizeof(buf), 0);
|
ret = recv(s, buf, sizeof(buf), 0);
|
||||||
if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
|
if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
|
||||||
return 1;
|
return 1;
|
||||||
@ -601,7 +609,7 @@ static int telnet_msg (WPARAM wParam, LPARAM lParam) {
|
|||||||
return -10000-WSAGetLastError();
|
return -10000-WSAGetLastError();
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
s = INVALID_SOCKET;
|
s = INVALID_SOCKET;
|
||||||
return 0; /* can't happen, in theory */
|
return 0;
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
if (in_synch) {
|
if (in_synch) {
|
||||||
@ -632,9 +640,6 @@ static int telnet_msg (WPARAM wParam, LPARAM lParam) {
|
|||||||
if (outbuf_head != outbuf_reap)
|
if (outbuf_head != outbuf_reap)
|
||||||
try_write();
|
try_write();
|
||||||
return 1;
|
return 1;
|
||||||
case FD_CLOSE:
|
|
||||||
s = INVALID_SOCKET;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return 1; /* shouldn't happen, but WTF */
|
return 1; /* shouldn't happen, but WTF */
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user