OpenSSL 3 OSSL_PROVIDER_unload 在库解构器中抛出未知信号
OpenSSL 3 OSSL_PROVIDER_unload throwing UNKNOWN SIGNAL in library deconstrutor
我正在编写一个库,我必须使用遗留算法,因为这些算法在 OpenSSL 3 的遗留提供程序中是分开的,所以我必须加载 legacy provider:
legacy = OSSL_PROVIDER_load(NULL, "legacy");
我在 C 构造函数中调用它,以便能够在加载库时执行必要的逻辑:
OSSL_PROVIDER *legacy;
__attribute__ ((constructor)) void init(void) {...}
使用 gcc 地址清理器我可以看到错误跟踪:
==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)
知道是什么原因造成的吗?
同时我自己找到了解决方案。我找到了 issue on GitHub。总结是 OpenSSL 最有可能使用 OPENSSL_cleanup
自动清理其资源。我分配的提供程序似乎已被 OpenSSL 清除,但由于我的代码引用了它,因此也必须清除。解决方案是指示 OpenSSL 在卸载库时不要清理并手动执行:
__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();
}
我正在编写一个库,我必须使用遗留算法,因为这些算法在 OpenSSL 3 的遗留提供程序中是分开的,所以我必须加载 legacy provider:
legacy = OSSL_PROVIDER_load(NULL, "legacy");
我在 C 构造函数中调用它,以便能够在加载库时执行必要的逻辑:
OSSL_PROVIDER *legacy;
__attribute__ ((constructor)) void init(void) {...}
使用 gcc 地址清理器我可以看到错误跟踪:
==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)
知道是什么原因造成的吗?
同时我自己找到了解决方案。我找到了 issue on GitHub。总结是 OpenSSL 最有可能使用 OPENSSL_cleanup
自动清理其资源。我分配的提供程序似乎已被 OpenSSL 清除,但由于我的代码引用了它,因此也必须清除。解决方案是指示 OpenSSL 在卸载库时不要清理并手动执行:
__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();
}