使用 -fsanitize=address 在 FreeBSD(clang9 和 clang11)上编译时,Openssl 卡在 SSL_library_init()

Posted

技术标签:

【中文标题】使用 -fsanitize=address 在 FreeBSD(clang9 和 clang11)上编译时,Openssl 卡在 SSL_library_init()【英文标题】:Openssl stucks on SSL_library_init() when compiled on FreeBSD (clang9 and clang11) when using -fsanitize=address 【发布时间】:2022-01-23 21:21:37 【问题描述】:

-fsanitize=address 中使用 -fsanitize=addressFreeBSD 13(OpenSSL 1.1.1k-freebsd 2021 年 3 月 25 日)上启动 Openssl 时,我的软件卡住了clang11,clang9也会出现同样的问题。

这个问题隐隐约约地发生在:

OpenSSL_add_all_algorithms(); SSL_library_init() SSL_load_error_strings();

重现问题:

#include <openssl/ssl.h>

int main(int argc, char *argv[]) 
    SSL_library_init();
    return EXIT_SUCCESS;

然后编译执行:

clang  -lssl -lcrypto -fsanitize=address -o test test.c && ./test

编译正常,但程序卡在 SSL_library_init() 使用 100% 的 CPU。一旦 -fsanitize=address删除,一切都会按预期工作。

【问题讨论】:

您遇到了这个错误:reviews.llvm.org/D84509 - ssl 正在调用 qsort,在使用地址清理程序运行时会损坏。我没有 search-fu 知道它什么时候得到修复。 这么长时间以来没有人意识到 LLVM9-LLVM11 和 SSL 存在问题吗?到目前为止,世界上没有人使用 sanitize 编译吗?我有那么幸运吗? 我可以确认问题也发生在 LLVM12 中。 @Petesh 您报告的错误似乎已于 2020 年 9 月 1 日修复(github.com/llvm/llvm-project/issues/46176)所以我不确定我们是否指向同一个错误。 LLVM12 于 2021 年 7 月 8 日发布,问题也发生在 LLVM12 上。另一方面,该行为与该错误中描述的完全一样。 【参考方案1】:

将 OP 的解决方案移至答案区域。

我回溯了该错误,这不是 OpenSSL 错误,我已确认这是 cmets 中指出的 LLVM 错误:

(gdb) bt
#0  0x000000000027ffa7 in wrapped_qsort_compar (a=0x80087ed60, b=0x80087eef0)
    at /usr/src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc:9741
#1  0x0000000800d6e974 in qsort () from /lib/libc.so.7
#2  0x0000000000280083 in __interceptor_qsort (base=<optimized out>, nmemb=44, size=80, 
    compar=<optimized out>)
    at /usr/src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc:9761
#3  0x0000000800d6f846 in qsort () from /lib/libc.so.7
#4  0x0000000000280083 in __interceptor_qsort (base=<optimized out>, nmemb=164, size=80, 
    compar=<optimized out>)
    at /usr/src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc:9761
#5  0x000000080082b6af in ?? () from /usr/lib/libssl.so.111
#6  0x000000080083120e in ?? () from /usr/lib/libssl.so.111
#7  0x0000000800835f39 in ?? () from /usr/lib/libssl.so.111
#8  0x0000000800b8fe23 in pthread_once () from /lib/libthr.so.3
#9  0x00000008009a1019 in CRYPTO_THREAD_run_once () from /lib/libcrypto.so.111
#10 0x0000000800835ce2 in OPENSSL_init_ssl () from /usr/lib/libssl.so.111
#11 0x00000000002b37a9 in main ()
(gdb) 
```

【讨论】:

以上是关于使用 -fsanitize=address 在 FreeBSD(clang9 和 clang11)上编译时,Openssl 卡在 SSL_library_init()的主要内容,如果未能解决你的问题,请参考以下文章

faker模块

自定义 WCF 绑定等效于 WSHttpBinding 且 WS-Addressing 已关闭

reference address是啥意思

Solidity(address的四个方法)

Get IPv4 Address 2.0

MongoDB高级索引