【发布时间】:2014-03-22 14:01:22
【问题描述】:
我在使用 Helgrind 测试多线程 (pthreads) 应用程序时遇到问题,报告 libcrypto.1.0.0 中的 CRYPTO_malloc() 中可能存在数百个数据竞争。
我已阅读并完全理解所有可用的文档,包括 Linux 网络编程权威指南第 255-259 页和http://www.openssl.org/docs/crypto/threads.html。
我的代码正在初始化静态和动态锁结构和回调,并注册线程ID回调:
CRYPTO_THREADID_set_callback(ssl_mitm_thread_id);
CRYPTO_set_dynlock_create_callback(ssl_mitm_dyn_create_lock);
CRYPTO_set_dynlock_lock_callback(ssl_mitm_dyn_locking_callback);
CRYPTO_set_dynlock_destroy_callback(ssl_mitm_dyn_destroy_lock);
ssl_mitm_lock_mutexes = (pthread_mutex_t*)malloc(CRYPTO_num_locks() *
sizeof(pthread_mutex_t));
for(i = 0; i < CRYPTO_num_locks(); i++) {
pthread_mutex_init(&ssl_mitm_lock_mutexes[i], NULL);
}
CRYPTO_set_locking_callback(ssl_mitm_locking_callback);
SSL_library_init();
SSL_load_error_strings();
...etc...
我在加锁回调函数中添加了debug语句,openSSL只是调用了已弃用的CRYPTO_set_locking_callback(),并没有使用新的动态加锁接口。
即便如此,它还是调用了旧的静态锁定函数,因此正在尝试线程同步,但 Helgrind 仍然认为存在很多可能的数据竞争。大多数(如果不是全部)都在 CRYPTO_malloc() 中。
那么,这个 Helgrind 是不是过于狂热了,还是它是 OpenSSL/libcrypto 中的一个错误?
例如
==20093== ----------------------------------------------------------------
==20093==
==20093== Possible data race during write of size 4 at 0x63BA368 by thread #3
==20093== Locks held: none
==20093== at 0x604F0FE: CRYPTO_malloc (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==20093== by 0x57F4186: ??? (in /lib/x86_64-linux-gnu/libssl.so.1.0.0)
==20093== by 0x57D20C4: ??? (in /lib/x86_64-linux-gnu/libssl.so.1.0.0)
==20093== by 0x57D62E1: ??? (in /lib/x86_64-linux-gnu/libssl.so.1.0.0)
==20093== by 0x57DF0B6: ??? (in /lib/x86_64-linux-gnu/libssl.so.1.0.0)
[snip] (SSL_connect() called)
==20093==
==20093== This conflicts with a previous write of size 4 by thread #6
==20093== Locks held: none
==20093== at 0x604F0FE: CRYPTO_malloc (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==20093== by 0x57E1673: ??? (in /lib/x86_64-linux-gnu/libssl.so.1.0.0)
==20093== by 0x57DF359: ??? (in /lib/x86_64-linux-gnu/libssl.so.1.0.0)
[snip] (SSL_connect() called)
==20093==
==20093== ----------------------------------------------------------------
从 SSL_read、SSL_write、SSL_connect 和 SSL_accept 等调用的 CRYPTO_malloc() 中还有其他数据竞争示例。
【问题讨论】:
标签: c multithreading openssl