diff options
author | Yang Tse <yangsita@gmail.com> | 2009-03-12 02:12:05 +0000 |
---|---|---|
committer | Yang Tse <yangsita@gmail.com> | 2009-03-12 02:12:05 +0000 |
commit | d15b8273d6bdb5f0aa590cce802ab75f9c3c3625 (patch) | |
tree | 32b485b6aa1b9d453570856aed5def27b408226d | |
parent | 0a5cf3a9283883a209d6f447d84f4320ce2f4b7b (diff) |
Add Curl_read() return code checking
-rw-r--r-- | lib/telnet.c | 40 |
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; } |