diff options
author | Daniel Stenberg <daniel@haxx.se> | 2016-10-18 11:12:03 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2016-10-18 11:14:48 +0200 |
commit | 9a509680f6b9f7d7fd2ef99380e2460a3973f31d (patch) | |
tree | 79b65a04b1ea4eecb139322fec437ff7f121a543 | |
parent | 8a6e89a9ebbaa79a2c4e4301774770efb3d24ef7 (diff) |
gopher: properly return error for poll failures
-rw-r--r-- | lib/gopher.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/lib/gopher.c b/lib/gopher.c index f16389e09..dcdd93fbb 100644 --- a/lib/gopher.c +++ b/lib/gopher.c @@ -121,20 +121,17 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done) result = Curl_write(conn, sockfd, sel, k, &amount); if(!result) { /* Which may not have written it all! */ result = Curl_client_write(conn, CLIENTWRITE_HEADER, sel, amount); - if(result) { - free(sel_org); - return result; - } + if(result) + break; + k -= amount; sel += amount; if(k < 1) break; /* but it did write it all */ } - else { - failf(data, "Failed sending Gopher request"); - free(sel_org); - return result; - } + else + break; + /* Don't busyloop. The entire loop thing is a work-around as it causes a BLOCKING behavior which is a NO-NO. This function should rather be split up in a do and a doing piece where the pieces that aren't @@ -144,14 +141,18 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done) Wait a while for the socket to be writable. Note that this doesn't acknowledge the timeout. */ - SOCKET_WRITABLE(sockfd, 100); + if(SOCKET_WRITABLE(sockfd, 100) < 0) { + result = CURLE_SEND_ERROR; + break; + } } free(sel_org); - /* We can use Curl_sendf to send the terminal \r\n relatively safely and - save allocing another string/doing another _write loop. */ - result = Curl_sendf(sockfd, conn, "\r\n"); + if(!result) + /* We can use Curl_sendf to send the terminal \r\n relatively safely and + save allocing another string/doing another _write loop. */ + result = Curl_sendf(sockfd, conn, "\r\n"); if(result) { failf(data, "Failed sending Gopher request"); return result; |