如何从OpenSSL释放SSL连接

How do I free an SSL Connection from OpenSSL?

本文关键字:SSL 连接 释放 OpenSSL      更新时间:2023-10-16

以下代码是否正确释放了所有分配的内存?

void foo(){
//set up connection
SSL *ssl = NULL;
SSL_METHOD *method = (SSL_METHOD *)SSLv23_client_method();
SSL_CTX *ctx = SSL_CTX_new(method);
BIO *bio = BIO_new_ssl_connect(ctx);
BIO_get_ssl(bio, &ssl);
BIO_set_conn_hostname(bio, "facebook.com:443");
doConnect(ssl, ctx, bio);
...
doFree(ssl, ctx, bio);
}
void doConnect(SSL *ssl, SSL_CTX *ctx, BIO *bio){
BIO_reset(bio); //this is here in case we are trying to reconnect
if (BIO_do_connect(connection->bio) <= 0){
while ( BIO_should_retry(connection->bio)){
if (BIO_do_connect(connection->bio) >0){
break;
} 
}
//error handeling in case BIO_should_retry returns false omitted.
}
if (SSL_get_verify_result(connection->ssl) != X509_V_OK){
// Handle the failed verification
}
int socket = BIO_get_fd(bio, NULL);
}
void doFree(SSL *ssl, SSL_CTX *ctx, BIO *bio){
BIO_free_all(bio); //is this right?
}

我想知道这是否是释放内存的正确方法,是因为我目前正在获取以下堆栈跟踪,我不知道我是否不正确地释放了内存,或者是其他类型的错误(valgrind没有报告任何内存错误,它只是停在这里)。

(gdb)bt#0 0x040010c2英寸??()来自/lib/ld-linux.so.2#1 0x06a13a0b在..写入()/sysdeps/unix/syscall模板.S:82#2 0x04153ae9英寸??()来自/lib/i386-linux-gnu/libcrypto.so.1.0.0#3来自/lib/i386-linux-gnu/libcrypto.so.1.0.0的BIO_write()中的0x041508e4#4 0x040771f1英寸??()来自/lib/i386-linux-gnu/libssl.so.1.0.0#5 0x040775ff英寸??()来自/lib/i386-linux-gnu/libssl.so.1.0.0#6 0x04078d2f英寸??()来自/lib/i386-linux-gnu/libssl.so.1.0.0#7 0x04077a64英寸??()来自/lib/i386-linux-gnu/libssl.so.1.0.0#8 0x04074代码在??()来自/lib/i386-linux-gnu/libssl.so.1.0.0#来自/lib/i386-linux-gnu/libssl.so.1.0.0的SSL_shutdown()中的9 0x0408eed1#10 0x0409b175英寸??()来自/lib/i386-linux-gnu/libssl.so.1.0.0#11来自/lib/i386-linux-gnu/libcrypto.so.1.0.0的BIO_free()中的0x04150638#来自/lib/i386-linux-gnu/libcrypto.so.1.0.0的BIO_free_all()中的12 0x041511c4

这可能是因为您的代码没有调用SSL_library_init();。添加includes、main和删除对connection的引用使这一切对我来说都有效

在没有SSL_library_init();的情况下,它在BIO_should_retry中崩溃,因为bioNULL

我正确地释放了内存。事实证明,这个问题是由于我使用了带线程的OpenSSL,但没有初始化OpenSSL的线程系统。