未验证 提交 73bd7a7d 编写于 作者: G guo 提交者: GitHub

Merge pull request #4868 from wenbodong2015/at_memleak

解决at_socket内存泄漏问题
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/errno.h>
#include <at_socket.h> #include <at_socket.h>
#include <at_device.h> #include <at_device.h>
...@@ -78,7 +79,7 @@ struct at_socket *at_get_socket(int socket) ...@@ -78,7 +79,7 @@ struct at_socket *at_get_socket(int socket)
} }
/* get a block to the AT socket receive list*/ /* get a block to the AT socket receive list*/
static size_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length) static rt_err_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length)
{ {
at_recv_pkt_t pkt = RT_NULL; at_recv_pkt_t pkt = RT_NULL;
...@@ -86,7 +87,7 @@ static size_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length) ...@@ -86,7 +87,7 @@ static size_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length)
if (pkt == RT_NULL) if (pkt == RT_NULL)
{ {
LOG_E("No memory for receive packet table!"); LOG_E("No memory for receive packet table!");
return 0; return -RT_ENOMEM;
} }
pkt->bfsz_totle = length; pkt->bfsz_totle = length;
...@@ -95,7 +96,7 @@ static size_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length) ...@@ -95,7 +96,7 @@ static size_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length)
rt_slist_append(rlist, &pkt->list); rt_slist_append(rlist, &pkt->list);
return length; return RT_EOK;
} }
/* delete and free all receive buffer list */ /* delete and free all receive buffer list */
...@@ -651,14 +652,20 @@ static void at_recv_notice_cb(struct at_socket *sock, at_socket_evt_t event, con ...@@ -651,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); RT_ASSERT(event == AT_SOCKET_EVT_RECV);
/* check the socket object status */ /* check the socket object status */
if (sock->magic != AT_SOCKET_MAGIC) if (sock->magic != AT_SOCKET_MAGIC || sock->state == AT_SOCKET_CLOSED)
{ {
rt_free((void *)buff);
return; return;
} }
/* put receive buffer to receiver packet list */ /* put receive buffer to receiver packet list */
rt_mutex_take(sock->recv_lock, RT_WAITING_FOREVER); 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_EOK)
{
rt_free((void *)buff);
rt_mutex_release(sock->recv_lock);
return;
}
rt_mutex_release(sock->recv_lock); rt_mutex_release(sock->recv_lock);
rt_sem_release(sock->recv_notice); rt_sem_release(sock->recv_notice);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册