eas 中由 ssl.c 文件中 SSL_close_all 引发的 bug

本文介绍了一个在SSL_close_all函数中出现的bug,并详细分析了问题的原因。该问题源于对socket文件描述符的不当处理,即在关闭后仍尝试进行写入操作。文章给出了修改后的代码,有效地避免了这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSL_close_all 函数的源码如下:
voidSSL_close_all(SSL*ssl,SSL_CTX*ctx,intclient_fd)
{
s_log(eDEBUG1,"calling shutdown(%i, SHUT_RDWR)",client_fd);
if(shutdown(client_fd,SHUT_RDWR)<0)
{
s_log(eERROR,"shutdown(%i, SHUT_RDWR): %.100s (%i)",client_fd,strerror(errno),errno);
s_log(eDEBUG1,"calling exit(%i)",EXIT_FAILURE);
exit(EXIT_FAILURE);
}

s_log(eDEBUG1,"calling close(%i)",client_fd);
if(close(client_fd)<0)
{
s_log(eERROR,"close(%i): %.100s (%i)",client_fd,strerror(errno),errno);
s_log(eDEBUG1,"calling exit(%i)",EXIT_FAILURE);
exit(EXIT_FAILURE);
}

s_log(eDEBUG2,"calling SSL_shutdown(%x)",ssl);
if(SSL_shutdown(ssl)<0)
{
s_log(eERROR,"SSL_shutdown: %.100s (%i)",strerror(errno),errno);
s_log(eDEBUG1,"calling exit(%i)",EXIT_FAILURE);
exit(EXIT_FAILURE);
}

s_log(eDEBUG2,"calling SSL_free(%x)",ssl);
SSL_free(ssl);

s_log(eDEBUG2,"calling SSL_CTX_free(%x)",ctx);
SSL_CTX_free(ctx);
}

在出现问题的服务器上使用 "strace" 对 easd 进程的系统调用进行跟踪, 发现
shutdown(client_fd, SHUT_RDWR) 使 socket 连接双方不能通过 client_fd 进行发送和接收;
close(client_fd) 关闭 socket 连接 client_fd
SSL_shutdown(ssl) 先往 client_fd 中写入数据, 再关闭 client_fd ( ssl 中应该含有 client_fd )

由上可知, 原有的代码会因为文件描述符引发 bug (关闭后还进行写入操作)
不知道原先很多系统中, 运行程序并没有报 bug, 猜测是因为不同的库对 SSL_shutdown() 的实现不同.

因此, 对于报 bug 的服务器 SSL_close_all 函数的代码应该改为:
voidSSL_close_all(SSL*ssl,SSL_CTX*ctx,intclient_fd)
{
s_log(eDEBUG2,"calling SSL_shutdown(%x)",ssl);
if(SSL_shutdown(ssl)<0)
{
s_log(eERROR,"SSL_shutdown: %.100s (%i)",strerror(errno),errno);
s_log(eDEBUG1,"calling exit(%i)",EXIT_FAILURE);
exit(EXIT_FAILURE);
}

s_log(eDEBUG1,"calling close(%i)",client_fd);
if(close(client_fd)<0)
{
s_log(eERROR,"close(%i): %.100s (%i)",client_fd,strerror(errno),errno);
s_log(eDEBUG1,"calling exit(%i)",EXIT_FAILURE);
exit(EXIT_FAILURE);
}

s_log(eDEBUG2,"calling SSL_free(%x)",ssl);
SSL_free(ssl);

s_log(eDEBUG2,"calling SSL_CTX_free(%x)",ctx);
SSL_CTX_free(ctx);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值