summaryrefslogtreecommitdiff
path: root/components/net/at/at_socket/at_socket.c
diff options
context:
space:
mode:
authorwenbodong2015 <[email protected]>2021-07-10 23:14:14 +0800
committerwenbodong2015 <[email protected]>2021-07-10 23:14:14 +0800
commitb9d24aff61993f8e95b7d5fa405bd4b7f2d0fe7c (patch)
treec06ce75e27fd76113120218c02018f2d0bffc207 /components/net/at/at_socket/at_socket.c
parente38a8e937864ebae325ed0d10a3134f288cb8baf (diff)
解决at_socket在极限情况下内存泄漏问题
AT模块在执行AT+CLOSE并返回OK后,在实际关闭前(上报URC前)仍然有 可能接收到数据。所以接收数据时需要判断状态是否为AT_SOCKET_CONNECT。 另,at_recv_notice_cb在拒绝数据包时,没有释放数据包内存,从而导致 内在泄漏。
Diffstat (limited to 'components/net/at/at_socket/at_socket.c')
-rw-r--r--components/net/at/at_socket/at_socket.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/components/net/at/at_socket/at_socket.c b/components/net/at/at_socket/at_socket.c
index 46d158dabf..27d2101c79 100644
--- a/components/net/at/at_socket/at_socket.c
+++ b/components/net/at/at_socket/at_socket.c
@@ -652,14 +652,20 @@ static void at_recv_notice_cb(struct at_socket *sock, at_socket_evt_t event, con
RT_ASSERT(event == AT_SOCKET_EVT_RECV);
/* check the socket object status */
- if (sock->magic != AT_SOCKET_MAGIC)
+ if (sock->magic != AT_SOCKET_MAGIC || sock->state != AT_SOCKET_CONNECT)
{
+ rt_free((void *)buff);
return;
}
/* put receive buffer to receiver packet list */
rt_mutex_take(sock->recv_lock, RT_WAITING_FOREVER);
- at_recvpkt_put(&(sock->recvpkt_list), buff, bfsz);
+ if (!at_recvpkt_put(&(sock->recvpkt_list), buff, bfsz))
+ {
+ rt_free((void *)buff);
+ rt_mutex_release(sock->recv_lock);
+ return;
+ }
rt_mutex_release(sock->recv_lock);
rt_sem_release(sock->recv_notice);