首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenSSL 3 OSSL_PROVIDER_unload在库分离器中抛出未知信号

OpenSSL 3 OSSL_PROVIDER_unload在库分离器中抛出未知信号
EN

Stack Overflow用户
提问于 2022-03-27 18:25:37
回答 1查看 250关注 0票数 0

我正在编写一个库,我必须使用遗留算法,由于这些算法是在OpenSSL 3中的遗留提供程序中分离的,所以我必须用以下内容加载遗留提供者

代码语言:javascript
运行
复制
legacy = OSSL_PROVIDER_load(NULL, "legacy");

我在C构造函数中调用它,以便在加载库时能够执行必要的逻辑:

代码语言:javascript
运行
复制
OSSL_PROVIDER *legacy;

__attribute__ ((constructor)) void init(void) {...}

用gcc的地址消毒剂,我可以看到故障的痕迹:

代码语言:javascript
运行
复制
==3355==ERROR: AddressSanitizer: UNKNOWN SIGNAL on unknown address 0x7ffee77f0e70 (pc 0x7fdde43056cc bp 0x000000000001 sp 0x7ffee77f1220 T0)
    #0 0x7fdde43056cc in pthread_rwlock_rdlock (/lib/x86_64-linux-gnu/libc.so.6+0x9a6cc)
    #1 0x7fdde4672dac in CRYPTO_THREAD_read_lock (/lib/x86_64-linux-gnu/libcrypto.so.3+0x1c1dac)
    #2 0x7fdde4666305  (/lib/x86_64-linux-gnu/libcrypto.so.3+0x1b5305)
    #3 0x7fdde4679244  (/lib/x86_64-linux-gnu/libcrypto.so.3+0x1c8244)
    #4 0x7fdde467a68b in OSSL_PROVIDER_unload (/lib/x86_64-linux-gnu/libcrypto.so.3+0x1c968b)
    #5 0x5573818b1011 in fini /globalplatform/globalplatform/src/init.c:71
    #6 0x7fdde53a424d  (/lib64/ld-linux-x86-64.so.2+0x624d)
    #7 0x7fdde42b0494  (/lib/x86_64-linux-gnu/libc.so.6+0x45494)
    #8 0x7fdde42b060f in exit (/lib/x86_64-linux-gnu/libc.so.6+0x4560f)
    #9 0x7fdde4294d96  (/lib/x86_64-linux-gnu/libc.so.6+0x29d96)
    #10 0x7fdde4294e3f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e3f)
    #11 0x55738188b044 in _start (/globalplatform/globalplatform/src/cryptoTest+0x16044)

有什么原因吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-27 22:22:07

同时,我自己找到了一个解决办法。我找到了关于GitHub的问题。总结是,OpenSSL正在自动清理其资源,很可能是使用OPENSSL_cleanup。我分配的提供程序似乎已经被OpenSSL清除了,但是由于我的代码有一个引用,所以也必须清除它。解决方案是指示OpenSSL在卸载库时不要清理,并手动执行:

代码语言:javascript
运行
复制
__attribute__ ((constructor)) void init(void) {
  OPENSSL_init_crypto(OPENSSL_INIT_NO_ATEXIT, NULL);
  # NOTE: error handling left out, it should be checked for NULL
  legacy = OSSL_PROVIDER_load(NULL, "legacy");
  deflt = OSSL_PROVIDER_load(NULL, "default");
}

__attribute__ ((destructor)) void fini(void) {
  if (legacy != NULL) {
    OSSL_PROVIDER_unload(legacy);
  }
  if (deflt != NULL) {
    OSSL_PROVIDER_unload(deflt);
  }
  OPENSSL_cleanup();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71639124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档