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
Répondre
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.
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é. –
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.
Je voudrais pouvoir accepter les deux réponses, merci pour l'aide! –
- 1. Segfault avec assemblage x86
- 2. Segfault avec stderr
- 3. Segfault avec boost :: ref
- 4. SegFault avec saisie d'un fichier
- 5. Segfault inattendu avec __gnu_parallel :: accumuler
- 6. Segfault avec insertion de liste?
- 7. makecontext segfault?
- 8. SegFault avec copie de producteur/consommateur Copie
- 9. Segfault Memcpy avec des pointeurs valides
- 10. SAS Segfault avec plot = option dans GENMOD
- 11. SegFault avec une version du code équivalent?
- 12. avec des points de suspension entraînant segfault
- 13. Strange segfault avec unique_ptr et shared_ptr
- 14. Valgrind détection de fuite avec segfault
- 15. segfault pendant fclose()
- 16. Segfault dans glGenFramebuffers
- 17. QNetworkReply provoque segfault
- 18. JRuby segfault sur Suse
- 19. Segfault in fread()
- 20. glCreateProgram provoque un segfault?
- 21. shared_ptr provoquant segfault
- 22. Pourquoi Google Test segfault?
- 23. curb + mechanize = segfault?
- 24. Segfault sur la carte
- 25. Eclipse Segfault (OSX)
- 26. Segfault - fclose/fopen
- 27. qvariant_cast provoquant segfault
- 28. Curieux cas de segfault
- 29. Segfault résultant de pthread?
- 30. Segfault sur mongrel_rails commencer
Vous demandez si libcrypto se corromprait avec plusieurs sessions? Je ne peux pas dire avec certitude mais j'en doute fortement. –
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! –