cURL / Mailing Lists / curl-library / Single Mail

curl-library

Crash and race condition with using libcurl with openssl

From: Anurag Shukla <anuragshuklaknp_at_gmail.com>
Date: Mon, 27 Feb 2012 20:02:34 +0530

I am facing some random crash issues using libcurl with openssl in a Multi
threaded program. I wrote a sample code to create 2 threads that will ping
to https://www.google.com.
Using [libcurl- 7.21.7] [openssl- 1.0.0d]

I have implemented the two callbacks function required by openssl

    #include <nspr.h>
    #include "curl.h"
    #include "openssl/crypto.h"
    static PRRWLock *lockarray[CRYPTO_NUM_LOCKS];

    static void ChangeLockStatus(int mode, int lock_index, const char*
file_name, int line_num) {
      if (mode & CRYPTO_LOCK) {
        if(mode & CRYPTO_WRITE) {
          PR_RWLock_Wlock(lockarray[lock_index]);
        } else if (mode & CRYPTO_READ) {
          PR_RWLock_Rlock(lockarray[lock_index]);
        }
      } else {
       PR_RWLock_Unlock(lockarray[lock_index]);
      }
    }
    static unsigned long ID_Callback(void) {
      unsigned long td = ::GetCurrentThreadId();
      return td;
    }
    static void Initialize() {
      int i;
      for (i = 0; i < CRYPTO_NUM_LOCKS; i++) {
        lockarray[i] = PR_NewRWLock(PR_RWLOCK_RANK_NONE, "a");
      }
      CRYPTO_set_locking_callback(ChangeLockStatus);
      CRYPTO_set_id_callback(ID_Callback);
    }
    void Test(void *arg) {
      int error_code;
      FILE *fd = fopen("a.txt", "w");
      while(1) {
      CURL * curl_connection = curl_easy_init();
      curl_easy_setopt(curl_connection, CURLOPT_TIMEOUT, 300);
      curl_easy_setopt(curl_connection, CURLOPT_CONNECTTIMEOUT, 60);
      curl_easy_setopt(curl_connection, CURLOPT_FOLLOWLOCATION, 1);
      curl_easy_setopt(curl_connection, CURLOPT_VERBOSE, 0);
      curl_easy_setopt(curl_connection, CURLOPT_SSL_VERIFYPEER, 0);
      error_code = curl_easy_setopt(curl_connection, CURLOPT_PROXY, "
192.168.1.1:8000");
      curl_easy_setopt(curl_connection, CURLOPT_FILE, fd);
      curl_easy_setopt(curl_connection, CURLOPT_URL, "https://www.google.com
");
      error_code = curl_easy_perform(curl_connection);
      curl_easy_cleanup(curl_connection);
      Sleep(3000);
      }
    }
    int main(int argc, char** argv) {
      curl_global_init(CURL_GLOBAL_ALL);
      Initialize();
      PRThread *threads[2];
     for(int i=0; i<2; i++) {
        threads[i] = PR_CreateThread(PR_USER_THREAD, Test, NULL,
PR_PRIORITY_LOW,
      PR_GLOBAL_THREAD, PR_JOINABLE_THREAD, 1024*10);
     }
     Sleep(3600000);
     curl_global_cleanup();
      for (int i = 0; i < CRYPTO_NUM_LOCKS; i++) {
        PR_DestroyRWLock(lockarray[i]);
      }
   }

When i ran this under Intel Parallel Studio to check for race conditions
,it gave a lot of race conditions in ssluse.c

View Source

    BIO *bio_out = BIO_new(BIO_s_mem());

    ssl_seeded = TRUE;

Any idea what am i doing wrong?

Thanks,
Anurag Shukla

-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html
Received on 2012-02-27