cURL / Mailing Lists / curl-library / Single Mail

curl-library

Re: Segmentation fault when ethernet cable is disconnected during a curl_easy_perform

From: Ray Satiro via curl-library <curl-library_at_cool.haxx.se>
Date: Sat, 5 Nov 2016 13:57:48 -0400

On 11/5/2016 10:32 AM, Ison wrote:
> / /* Upload file *///
> // if(CURLE_OK != (ret_val = curl_easy_perform(curl)))//
> // {//
> // //printf("Curl Perform Upload Failed...\n");//
> // printf("Curl Perform Upload Failed...%d...%s\n",
> ret_val, curl_easy_strerror(ret_val));//
> //*sleep(20);*//
> // }//
> // else//
> // {//
> // printf("Curl Perform Upload Success...\n");//
> // ret_val = g_SUCCESS_c;//
> // }//
> //
> // fclose(p_file);//
> // }
> }
>
> /Now, if I disconnect my ethernet cable after the file upload has
> started, i.e, I am able to see the following prints in console
>
> /UP: 0 of 0 DOWN: 0 of 0//
> //UP: 0 of 0 DOWN: 0 of 0//
> //UP: 0 of 0 DOWN: 0 of 0//
> //UP: 0 of 0 DOWN: 0 of 0//
> //UP: 0 of 0 DOWN: 0 of 0//
> //UP: 0 of 0 DOWN: 0 of 0/
>
> *Disconnect ethernet cable here*
>
> /Curl Perform Upload Failed...28...Timeout was reached//
>
> /I am able to continue with the rest of the operations after this/
> /
> But if I disconnect the cable before this prints starts, i.e when the
> library is trying to resolve the host name, I get the following output
> on console and a seg fault after some time
>
> /Curl Perform Upload Failed...6...Couldn't resolve host name//
> /
> My application is simply waits at this print for 20 seconds. In this
> case I observe a segmentation fault occurring after around 10seconds
> every time.
>
> The only difference between the two case is the time at which the
> ethernet cable was pulled out which gave two different errors. Do we
> have to do any other settings to handle an ethernet cable
> disconnection when host name resolving does not happen?

Try disabling signals, CURLOPT_NOSIGNAL [1]. Read thread safety [2] if
you are using threads. Make a debug build using --enable-debug and give
us the stacktrace from a crash, the curl_version() and what resolver
libcurl is using [3].

Also check that p_file != NULL, it doesn't look like you're checking
fopen return. IIRC it's not required by any C standard that fclose(NULL)
be acceptable. It should be
if(p_file)
  fclose(p_file)
or better check it earlier and do not continue if NULL

[1]: https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html
[2]: https://curl.haxx.se/libcurl/c/threadsafe.html
[3]: https://gist.github.com/jay/d3323a81345e75462b70

-------------------------------------------------------------------
List admin: https://cool.haxx.se/list/listinfo/curl-library
Etiquette: https://curl.haxx.se/mail/etiquette.html
Received on 2016-11-05