2013-09-21 47 views
0

我面臨一個奇怪的OpenSSL問題:當我的應用程序作爲win32服務(本地服務/網絡服務或系統服務)運行時,似乎SSL_CTX_new()函數崩潰。OpenSSL SSL_CTX_new當以win32服務運行時崩潰

我的代碼如下所示:

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()在一個單獨的線程)一切都完美無缺。

我正在編譯與mingw32 gcc 4.7.1在win7上,我正在靜態鏈接openssl(沒有DLL)。

任何幫助試圖瞭解問題將不勝感激。 謝謝!

+0

經過一些調試後,似乎崩潰發生在RAND_pseudo_bytes函數內 – user2802092

+0

我對OpenSSL源碼一無所知,但我懷疑失敗發生在RAND_pseudo_bytes之前,但它在崩潰(可能是空的解除引用)。如果你可以發佈堆棧回溯,這可能會有所幫助。 –

+0

我在Win32服務中使用OpenSSL,它對我來說工作正常,所以這必須是您的OpenSSL特定版本的問題。你在哪裏得到它?您是自己編譯它,還是使用第三方預編譯構建?我使用鏈接到OpenSSL網站的[Binaries](http://www.openssl.org/related/binaries.html)部分的Win32版本。 –

回答

0

更多調試後我發現ossl_threadid_function(!!!) 中的一個非常愚蠢的錯誤顯然返回錯誤的ID導致openssl內的堆棧損壞,這就是爲什麼我沒有產生任何有用的回溯。令人驚訝的是,運行該應用程序作爲一個正常的進程而不是服務沒有造成任何問題,甚至沒有運行時工具,如Application Verifier所指出的那樣。很明顯,這與服務實例至少有一個線程有關...

對不起,感謝所有的時間。 此致敬禮。