由于工程需要,目前只使用了sal_socket而没有上DFS,在使用mbedtls时会有一些问题(mbedtls中对于DFS的相关依赖代码已修改),
问题如下:
当调用sal_closesocket时,在该函数的proto_tls->ops->closesocket()
处调用时,内部再次调用到sal_closesocket,导致后续在调用socket_delete
中断言出错(即调用了两次socket_delete),因此需要增加判断,如下所示。
int sal_closesocket(int socket)
{
struct sal_socket *sock;
struct sal_proto_family *pf;
int error = 0;
/* get the socket object by socket descriptor */
SAL_SOCKET_OBJ_GET(sock, socket);
/* clsoesocket operation not need to vaild network interface status */
/* valid the network interface socket opreation */
SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, pf, closesocket);
if (pf->skt_ops->closesocket((int) sock->user_data) == 0)
{
#ifdef SAL_USING_TLS
if (SAL_SOCKOPS_PROTO_TLS_VALID(sock, closesocket))
{
if (proto_tls->ops->closesocket(sock->user_data_tls) < 0)
{
return -1;
}
}
#endif
error = 0;
}
else
{
error = -1;
}
/* 添加此处判断,确保只调用一次socket_delete */
#if defined(SAL_USING_TLS) && !defined(SAL_USING_POSIX)
/* if use mebedtls with only sal, sal_closesocket will be called in */
/* proto_tls->ops->closesocket again, check the socket object status
* so that to sure calling socket_delete only one time */
if (sock->magic != SAL_SOCKET_MAGIC)
return -1;
#endif
/* delete socket */
socket_delete(socket);
return error;
}
不知道这样改是否比较合理?