openssl的CRYPTO_set_locking_callback

openssl可以在多线程环境下使用,但前提是向openssl提供线程锁设施,通过CRYPTO_set_locking_callback设置。

在一些复杂软件环境环境中,可能存在多个上层模块同时使用openssl,并且都通过CRYPTO_set_locking_callback设置锁设施,如果出现这种情况,就悲剧了,例如:

xxx.exe - curl - openssl

            qtnetworks - openssl

上面的例子是xxx.exe依赖curl及qtnetwork,curl和qtnetwork都使用CRYPTO_set_locking_callback设置锁设施。

类似的问题在openssl的bugtrack里面也有人反映,但openssl没有正面回应这个问题,所以这种情况还是需要开发者自己解决。

http://rt.openssl.org/Ticket/Display.html?id=2293&user=guest&pass=guest

解决方法

1.参考openssl CRYPTO_thread_setup函数自己实现锁,屏蔽外界CRYPTO_set_locking_callback调用;

或者

2.在xxx.exe内hook openssl CRYPTO_set_locking_callback,实现线程安全,不重复设置逻辑。

原文地址:https://www.cnblogs.com/rickerliang/p/4788975.html