2011-10-10 2 views
1

Ceci est plus hypothétique lorsque je débogue du code. Disons que j'ai une application (appelée X) qui appelle une lib pour envoyer un email via une connexion SMTP cryptée par TLS, alors que X est en train de parler à une autre lib qui établit une autre socket TLS via la même librairie libcrypto, Quelle est la probabilité d'obtenir une condition spécifique (et étrange) où un appel de fonction échouerait avec un segfault? Je suis un peu à l'aise avec les pailles, ce code a bien fonctionné jusqu'à ce que nous ayons ajouté le SDK Skype qui se connecte sur TLS aux serveurs Skype, car nous pouvons en fait reproduire le problème mais je suis un peu déconcerté quant à pourquoi. (Je suis probablement en train de négliger l'évident, mais je vais commencer par la possibilité vraiment étrange)Segfault avec libssl/libcrypto

+0

Vous demandez si libcrypto se corromprait avec plusieurs sessions? Je ne peux pas dire avec certitude mais j'en doute fortement. –

+0

Ouais c'est ce que je pensais, mais j'ai pensé que ça valait la peine de demander. Tuez les réponses absurdes en premier! –

Répondre

2

En gros, cela pourrait être possible - mais une bibliothèque bien écrite devrait être robuste à l'accès multiple. Vous pourriez vouloir regarder à travers la documentation pour voir si leur API est réentrante (ou même thred-safe). S'il est thread-safe, alors (en supposant que les auteurs de libcrypto ne se soient pas trompés), vous pouvez être sûr que ce n'est pas la raison du problème. Si elle est réentrante, alors tout ce qui utilise cette lib dans deux threads (ou plus) doit être synchronisé à l'accès (par exemple en utilisant des mutex), mais si des parties de code ne sont pas écrites par vous et que vous n'avez aucune option pour modiffer il, alors vous êtes coincé. La seule chose que je peux penser serait d'utiliser une autre version de libcrypto, donc le système crée une autre instance sans rapport de sa structure interne. C'est la soultion laide et pourrait se comporter bizarrement sur les machines de l'utilisateur.

+0

Ah, eh bien, ça m'a indiqué une direction qui pourrait l'expliquer. Cela m'a pointé à [http://horstr.blogspot.com/2008/04/on-libcurl-openssl-and-thread-safety.html](this blog post) qui suggère que libssl n'est pas entièrement thread safe, qui pourrait commencer à expliquer l'étrangeté. –

2

Il existe une page man complète dédiée à l'utilisation de la bibliothèque OpenSSL et des threads: man 3 threads. Vous devrez utiliser ceci si votre application a plusieurs threads qui utilisent la bibliothèque OpenSSL.

+0

Je voudrais pouvoir accepter les deux réponses, merci pour l'aide! –