aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/telnet.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/lib/telnet.c b/lib/telnet.c
index d0d211a6b..109e081d8 100644
--- a/lib/telnet.c
+++ b/lib/telnet.c
@@ -1200,6 +1200,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
int interval_ms;
struct pollfd pfd[2];
#endif
+ int ret;
ssize_t nread;
struct timeval now;
bool keepon = TRUE;
@@ -1370,8 +1371,23 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
break;
}
if(events.lNetworkEvents & FD_READ) {
- /* This reallu OUGHT to check its return code. */
- (void)Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
+ /* read data from network */
+ ret = Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
+ /* returned sub-zero, this would've blocked. Loop again */
+ if(ret < 0)
+ break;
+ /* returned not-zero, this an error */
+ else if(ret) {
+ keepon = FALSE;
+ code = (CURLcode)ret;
+ break;
+ }
+ /* returned zero but actually received 0 or less here,
+ the server closed the connection and we bail out */
+ else if(nread <= 0) {
+ keepon = FALSE;
+ break;
+ }
telrcv(conn, (unsigned char *)buf, nread);
@@ -1441,12 +1457,20 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
}
if(pfd[0].revents & POLLIN) {
- /* This OUGHT to check the return code... */
- (void)Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
-
- /* if we receive 0 or less here, the server closed the connection and
- we bail out from this! */
- if(nread <= 0) {
+ /* read data from network */
+ ret = Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
+ /* returned sub-zero, this would've blocked. Loop again */
+ if(ret < 0)
+ break;
+ /* returned not-zero, this an error */
+ else if(ret) {
+ keepon = FALSE;
+ code = (CURLcode)ret;
+ break;
+ }
+ /* returned zero but actually received 0 or less here,
+ the server closed the connection and we bail out */
+ else if(nread <= 0) {
keepon = FALSE;
break;
}