curl-library
Re: double free or corruption error on post with libcurl
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.htmlReceived on 2005-05-09