2011-10-10 65 views
1

這是更多的假設,而我正在調試一些代碼。假設我有一個應用程序(稱爲X),它呼叫一個lib通過TLS加密的SMTP連接發送一封電子郵件,同時X正在與另一個通過相同libcrypto庫建立另一個TLS套接字的lib進行通話,在一個函數調用失敗並出現段錯誤時,獲得一些特定(和奇怪)條件的可能性是什麼?Segfault與libssl/libcrypto

我很喜歡抓秸稈,這段代碼工作得很好,直到我們添加了通過TLS連接到Skype服務器的Skype SDK,因爲我們實際上可以讓問題變得可重複,但我有點對於爲什麼感到困惑。 (我很可能忽略了這個明顯的問題,但我會以非常奇怪的可能性開始)

+0

你在問libcrypto是否會在多個會話中破壞自己?我不能肯定地說,但我非常懷疑它。 –

+0

是的,這是我的想法,但我認爲這是值得問。先殺掉荒謬的答案吧! –

回答

2

完全一般地說它可能是可能的 - 但編寫良好的庫應該對多個訪問有效。您可能需要查看文檔以查看其API是否可重入(或甚至是安全的)。

如果它是線程安全的,那麼(假設libcrypto作者沒有犯錯),你可以肯定這不是問題的原因。

如果它是可重入的,那麼任何在兩個(或更多)線程中使用這個lib的東西應該在訪問時同步(例如使用互斥鎖),但是如果部分代碼不是由你寫的,而且你沒有選擇修改它,那麼你卡住了。我唯一能想到的就是使用另一個版本的libcrypto,因此係統會創建另一個與其內部結構無關的實例。這是醜陋的靈魂,可能會在用戶機器上表現怪異。

+0

啊,那實際上是指向了一個可以解釋它的方向。這表明我在[http://horstr.blogspot.com/2008/04/on-libcurl-openssl-and-thread-safety.html](這篇博客文章)中建議libssl不完全是線程安全的,可以開始解釋怪異。 –

2

有一整個專門用於OpenSSL庫和線程的手冊頁:man 3 threads。如果你的應用程序有多個使用OpenSSL庫的線程,你將需要使用它。

+0

我希望我能接受這兩個答案,謝謝你的幫助! –