cURL / Mailing Lists / curl-library / Single Mail


pthread_cancel while in curl_easy_perform

From: Andrew Strohman <>
Date: Tue, 29 Jan 2013 13:27:52 -0800


  I would like to be able to cancel a thread that is in the middle of
curl_easy_perform without leaking memory or sockets. My first attempt
was to do this:

 curl_handle = curl_easy_init();
 pthread_cleanup_push((void (*)(void*))curl_easy_cleanup, (void *)curl_handle);

I noticed that when I cancel a a thread while it's still attempting to
connect, I leak sockets. Strangely, this does not appear to happen
the first couple of times this happens, but then leaks sockets
consistently thereafter. So it seems like curl_easy_cleanup will not
clean up all resources if curl_easy_perform is not allowed to

To try to work around this, I do:

void closeSock(void * pSock)
  if(*(int *)pSock != -1)
    if(!close(*(short int *)pSock))
      *(int *)pSock = -1;

int curl_close_socket(void *clientp, curl_socket_t item)
  return 0;

curl_socket_t curl_open_socket(void *clientp, curlsocktype purpose,
struct curl_sockaddr *address)
  int sock = socket(address->family, address->socktype, address->protocol);
  *(int *)clientp = sock;
  return sock;

 CURL *curl_handle;
 int sock = -1;
 pthread_cleanup_push(closeSock, &sock);
 curl_handle = curl_easy_init();
 pthread_cleanup_push((void (*)(void*))curl_easy_cleanup, (void *)curl_handle);

  if(curl_easy_setopt(curl_handle, CURLOPT_OPENSOCKETFUNCTION,
  if(curl_easy_setopt(curl_handle, CURLOPT_OPENSOCKETDATA, &sock))
 if(curl_easy_setopt(curl_handle, CURLOPT_CLOSESOCKETFUNCTION,
  if(curl_easy_setopt(curl_handle, CURLOPT_CLOSESOCKETDATA, &sock))

This stops the sockets from being leaked.

I have two problems with what I did here:

1) Is there some other resource that will be leaked besides these sockets?
2) If I comment out the closeSock(clientp) call in curl_close_socket,
it seems like the socket gets closed anyway? The behaviour I expect
is that none of the sockets would get closed. Can you guys help me
understand that? I want to make sure that curl_close_socket is the
only way sockets are being closed so that another threads socket does
not get inadvertently closed.

I am using libcurl/7.22.0, and I don't see those curl_easy_setopt calls failing.

Any help would be much appreciated.


List admin:
Received on 2013-01-29