diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2017-10-06 17:20:54 +0200 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2017-10-07 00:20:31 +0200 | 
| commit | 5b54df06d2cec422d5f237e0fa0212be0303edce (patch) | |
| tree | d37eab3cb0209848942478c593902af21c689090 /lib | |
| parent | 0af5ac27c3d818f0a962de1e1029c0af7d497080 (diff) | |
pingpong: return error when trying to send without connection
When imap_done() got called before a connection is setup, it would try
to "finish up" and dereffed a NULL pointer.
Test case 1553 managed to reproduce. I had to actually use a host name
to try to resolve to slow it down, as using the normal local server IP
will make libcurl get a connection in the first curl_multi_perform()
loop and then the bug doesn't trigger.
Fixes #1953
Assisted-by: Max Dymond
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pingpong.c | 11 | 
1 files changed, 9 insertions, 2 deletions
| diff --git a/lib/pingpong.c b/lib/pingpong.c index b8f214005..ef865ae54 100644 --- a/lib/pingpong.c +++ b/lib/pingpong.c @@ -168,16 +168,22 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,    char *s;    CURLcode result;    struct connectdata *conn = pp->conn; -  struct Curl_easy *data = conn->data; +  struct Curl_easy *data;  #ifdef HAVE_GSSAPI -  enum protection_level data_sec = conn->data_prot; +  enum protection_level data_sec;  #endif    DEBUGASSERT(pp->sendleft == 0);    DEBUGASSERT(pp->sendsize == 0);    DEBUGASSERT(pp->sendthis == NULL); +  if(!conn) +    /* can't send without a connection! */ +    return CURLE_SEND_ERROR; + +  data = conn->data; +    fmt_crlf = aprintf("%s\r\n", fmt); /* append a trailing CRLF */    if(!fmt_crlf)      return CURLE_OUT_OF_MEMORY; @@ -205,6 +211,7 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,    result = Curl_write(conn, conn->sock[FIRSTSOCKET], s, write_len,                       &bytes_written);  #ifdef HAVE_GSSAPI +  data_sec = conn->data_prot;    DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST);    conn->data_prot = data_sec;  #endif | 
