1
0
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:
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; 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
View File

@ -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 */
} }

View File

@ -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 */
} }