1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00

Fix unexpected network error 5000

[originally from svn r286]
This commit is contained in:
Simon Tatham 1999-11-09 11:34:14 +00:00
parent edf8b22b98
commit b51c18f24c
3 changed files with 33 additions and 19 deletions

17
raw.c
View File

@ -150,14 +150,22 @@ static int raw_msg (WPARAM wParam, LPARAM lParam) {
int ret;
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)
return -WSAGETSELECTERROR(lParam);
switch (WSAGETSELECTEVENT(lParam)) {
case FD_READ:
case FD_CLOSE:
ret = recv(s, buf, sizeof(buf), 0);
if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
return 1;
@ -165,7 +173,7 @@ static int raw_msg (WPARAM wParam, LPARAM lParam) {
return -10000-WSAGetLastError();
if (ret == 0) {
s = INVALID_SOCKET;
return 0; /* can't happen, in theory */
return 0;
}
c_write( buf, ret );
return 1;
@ -184,9 +192,6 @@ static int raw_msg (WPARAM wParam, LPARAM lParam) {
if (outbuf_head != outbuf_reap)
try_write();
return 1;
case FD_CLOSE:
s = INVALID_SOCKET;
return 0;
}
return 1; /* shouldn't happen, but WTF */
}

18
ssh.c
View File

@ -772,14 +772,22 @@ static int ssh_msg (WPARAM wParam, LPARAM lParam) {
int ret;
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)
return -WSAGETSELECTERROR(lParam);
switch (WSAGETSELECTEVENT(lParam)) {
case FD_READ:
case FD_CLOSE:
ret = recv(s, buf, sizeof(buf), 0);
if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
return 1;
@ -787,14 +795,10 @@ static int ssh_msg (WPARAM wParam, LPARAM lParam) {
return -10000-WSAGetLastError();
if (ret == 0) {
s = INVALID_SOCKET;
return 0; /* can't happen, in theory */
return 0;
}
ssh_gotdata (buf, ret);
return 1;
case FD_CLOSE:
s = INVALID_SOCKET;
ssh_state = SSH_STATE_CLOSED;
return 0;
}
return 1; /* shouldn't happen, but WTF */
}

View File

@ -586,14 +586,22 @@ static int telnet_msg (WPARAM wParam, LPARAM lParam) {
int ret;
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)
return -WSAGETSELECTERROR(lParam);
switch (WSAGETSELECTEVENT(lParam)) {
case FD_READ:
case FD_CLOSE:
ret = recv(s, buf, sizeof(buf), 0);
if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
return 1;
@ -601,7 +609,7 @@ static int telnet_msg (WPARAM wParam, LPARAM lParam) {
return -10000-WSAGetLastError();
if (ret == 0) {
s = INVALID_SOCKET;
return 0; /* can't happen, in theory */
return 0;
}
#if 0
if (in_synch) {
@ -632,9 +640,6 @@ static int telnet_msg (WPARAM wParam, LPARAM lParam) {
if (outbuf_head != outbuf_reap)
try_write();
return 1;
case FD_CLOSE:
s = INVALID_SOCKET;
return 0;
}
return 1; /* shouldn't happen, but WTF */
}