作为win32服务运行时,OpenSSL SSL_CTX_new崩溃

时间:2013-09-21 13:25:44

标签: c++ multithreading winapi ssl openssl

我面临一个奇怪的OpenSSL问题:当我的应用程序作为win32服务(本地服务/网络服务或系统服务)运行时,似乎SSL_CTX_new()函数崩溃。

我的代码如下所示:

int main() {
   SSL_library_init();

   const int nLocks = CRYPTO_num_locks();

   ossl_mtx_pool = new mutexT* [nLocks]; // simple wrapper class over mutexes
   for(int i = 0; i < nLocks; ++i)
      ossl_mtx_pool[i] = new mutexT;

   CRYPTO_THREADID_set_callback(ossl_threadid_function); // returns win32 thread id
   CRYPTO_set_locking_callback(ossl_locking_fun); // simple function that calls mutexT::lock/unlock)

   OpenSSL_add_all_algorithms();
   SSL_load_error_strings();
   ERR_load_BIO_strings();

   // some other app initialization here...

   // run win32 service thread OR just a seaparate thread
}

// called later on in the context of a different thread
int myclient()
{
   myCtx *ctx = new connContextT;
   const SSL_METHOD *mm = SSLv23_client_method();
   if(mm == 0) {
      // print some error whcih doesn't show up
   }   

   printf("I'm Here!\n"); //< this print shows up       

   ctx->sslCtx = SSL_CTX_new(mm);
   // crash >HERE< before being able to print anything else

   // some code to connect to server
}

真正奇怪的是,如果我将这个应用程序作为普通的win32应用程序运行(即不调用win32服务函数,但仍然在一个单独的线程中运行myclient()),一切都运行完美。

我正在使用win7上的mingw32 gcc 4.7.1进行编译,我正在静态链接openssl(没有DLL)。

非常感谢任何帮助您尝试理解这个问题。 谢谢!

1 个答案:

答案 0 :(得分:0)

经过更多的调试后,我发现ossl_threadid_function中有一个非常愚蠢的错误(!!!) 显然返回错误的ID会导致openssl中的堆栈损坏,这就是我无法产生任何有用的回溯的原因。

令人惊讶的是,将应用程序作为正常进程而不是服务运行并没有造成任何问题,甚至不像Application Verifier指出的那样运行时工具。显然,这与服务实例至少还有一个线程...

有关

对此感到抱歉,谢谢大家的时间。 问候。