cURL / Mailing Lists / curl-library / Single Mail

curl-library

Re: double free or corruption error on post with libcurl

From: Jeremy Brown <jbrown_at_novell.com>
Date: Mon, 09 May 2005 09:15:58 -0600

 
Daniel,
 
Openssl was the culprit and I it took a bit to find a solution that fixes the openssl problem but here is one I found posted on the web. I included it in case someone else needs it. It solved my problem with the double free or corruption errors. Works like a charm.
 
Thanks
jeremy
 
 
 
 
 
#define MUTEX_TYPE pthread_mutex_t
#define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL)
#define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
#define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
#define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
#define THREAD_ID pthread_self( )
 
 
void handle_error(const char *file, int lineno, const char *msg){
     fprintf(stderr, ** %s:%i %s\n, file, lineno, msg);
     ERR_print_errors_fp(stderr);
     //exit(-1);
 }
 
 
/* This array will store all of the mutexes available to OpenSSL. */
static MUTEX_TYPE *mutex_buf= NULL;
 
 
static void locking_function(int mode, int n, const char * file, int line){
    if (mode & CRYPTO_LOCK)
        MUTEX_LOCK(mutex_buf[n]);
    else
        MUTEX_UNLOCK(mutex_buf[n]);
}
  
static unsigned long id_function(void){
    return ((unsigned long)THREAD_ID);
}
  
int thread_setup(void){
    int i;
  
    mutex_buf = (MUTEX_TYPE *)malloc(CRYPTO_num_locks( ) * sizeof(MUTEX_TYPE));
    if (!mutex_buf)
        return 0;
    for (i = 0; i < CRYPTO_num_locks( ); i++)
        MUTEX_SETUP(mutex_buf[i]);
    CRYPTO_set_id_callback(id_function);
    CRYPTO_set_locking_callback(locking_function);
    return 1;
}
  
int thread_cleanup(void)
{
    int i;
  
    if (!mutex_buf)
        return 0;
    CRYPTO_set_id_callback(NULL);
    CRYPTO_set_locking_callback(NULL);
    for (i = 0; i < CRYPTO_num_locks( ); i++)
        MUTEX_CLEANUP(mutex_buf[i]);
    free(mutex_buf);
    mutex_buf = NULL;
    return 1;
}

>>>jbrown_at_novell.com 05/04/05 3:08 pm >>>
Daniel,
  
I spoke too soon. It ran a couple times then returned back to having error.
  
I will give the openssl information a try and let you know how it works out. BTW Great list to have such quick responses.
  
Thanks
jeremy

>>>daniel-curl_at_haxx.se 05/04/05 12:07 pm >>>
On Wed, 4 May 2005, Jeremy Brown wrote:

>I am receiving an error in my c program when I reach 10 threads

You need to set two OpenSSL callback functions to be able to use
SSL-related connections multi-threaded:

  http://www.openssl.org/docs/crypto/threads.html

I'm personally not too happy to force applications to have to deal with
OpenSSL directly since libcurl does a good job at hiding that dependency in
all other aspects, and with the upcoming GnuTLS support it'll be even
uglier...

--
 Commercial curl and libcurl Technical Support: http://haxx.se/curl.html
Received on 2005-05-09