Skip to content

Commit b9d24af

Browse files
committed
解决at_socket在极限情况下内存泄漏问题
AT模块在执行AT+CLOSE并返回OK后,在实际关闭前(上报URC前)仍然有 可能接收到数据。所以接收数据时需要判断状态是否为AT_SOCKET_CONNECT。 另,at_recv_notice_cb在拒绝数据包时,没有释放数据包内存,从而导致 内在泄漏。
1 parent e38a8e9 commit b9d24af

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

components/net/at/at_socket/at_socket.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -652,14 +652,20 @@ static void at_recv_notice_cb(struct at_socket *sock, at_socket_evt_t event, con
652652
RT_ASSERT(event == AT_SOCKET_EVT_RECV);
653653

654654
/* check the socket object status */
655-
if (sock->magic != AT_SOCKET_MAGIC)
655+
if (sock->magic != AT_SOCKET_MAGIC || sock->state != AT_SOCKET_CONNECT)
656656
{
657+
rt_free((void *)buff);
657658
return;
658659
}
659660

660661
/* put receive buffer to receiver packet list */
661662
rt_mutex_take(sock->recv_lock, RT_WAITING_FOREVER);
662-
at_recvpkt_put(&(sock->recvpkt_list), buff, bfsz);
663+
if (!at_recvpkt_put(&(sock->recvpkt_list), buff, bfsz))
664+
{
665+
rt_free((void *)buff);
666+
rt_mutex_release(sock->recv_lock);
667+
return;
668+
}
663669
rt_mutex_release(sock->recv_lock);
664670

665671
rt_sem_release(sock->recv_notice);

0 commit comments

Comments
 (0)