如何从OpenSSL释放SSL连接
How do I free an SSL Connection from OpenSSL?
以下代码是否正确释放了所有分配的内存?
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
中崩溃,因为bio
是NULL
。
我正确地释放了内存。事实证明,这个问题是由于我使用了带线程的OpenSSL,但没有初始化OpenSSL的线程系统。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 无法在windows上使用mingw将sqlite3与c连接
- 对等方断开连接后未释放 SSL 内存
- vcpkg 安装失败,并显示"SSL 连接错误"
- 设置SSL连接并发送GET信息
- 如何从连接的 SSL 会话获取 base64 编码证书 (PEM)
- 如何从OpenSSL释放SSL连接
- 使用 boost::asio SSL 服务器减少每个连接的内存使用量
- 提升 SSL 连接时出现连接问题
- 通过同一个ssl连接从多个线程发送请求
- 使用Winsock创建SSL连接
- 无法使用LDAP SSL连接服务器
- 在未保留与服务器的连接时使用 SSL
- 如何确定阻塞的 SSL BIO 连接是否已关闭
- 使用 .pfx (pkcs12) 文件而不是 .pem 文件建立 SSL 连接的编程方式
- 通过C++中的SSL实现简单的数据库连接
- 使用POCO上传文件- SSL连接意外关闭异常
- c++ Boost asio (OpenSSL)获取密码和TLS/SSL版本的活动连接
- Boost asio SSL -连接成功后尝试发送请求