You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ya...@apache.org on 2021/02/17 03:56:01 UTC
[incubator-nuttx] branch master updated: arch: esp32: Fix a memory
leak when discarding a large packet.
This is an automated email from the ASF dual-hosted git repository.
yamamoto pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 102adaf arch: esp32: Fix a memory leak when discarding a large packet.
102adaf is described below
commit 102adaf0268e3d9ab6ba14d5dfe7a65f1750ebe9
Author: Masayuki Ishikawa <ma...@gmail.com>
AuthorDate: Tue Feb 16 15:13:30 2021 +0900
arch: esp32: Fix a memory leak when discarding a large packet.
Summary:
- Recently I noticed that ESP32-DevKitC-32D suddenly stops
during receiving ping packets from PC after 10-20mins
- Actually, sometimes memory leak happened when some device
sent a big broadcast packet periodically on the network
- This commit fixes this issue by calling esp_wifi_free_eb()
in the case that the packet exceeds WLAN_BUF_SIZE.
- Also, this commit applies the same logic in the case that
the Wi-Fi interface is down
Impact:
- None
Testing:
- Tested with esp32-devkitc:wapi
Suggested-by: YAMAMOTO Takashi <ya...@midokura.com>
Signed-off-by: Masayuki Ishikawa <Ma...@jp.sony.com>
---
arch/xtensa/src/esp32/esp32_wlan.c | 22 ++++++++++++++--------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/arch/xtensa/src/esp32/esp32_wlan.c b/arch/xtensa/src/esp32/esp32_wlan.c
index fe2b906..6578843 100644
--- a/arch/xtensa/src/esp32/esp32_wlan.c
+++ b/arch/xtensa/src/esp32/esp32_wlan.c
@@ -483,28 +483,26 @@ static int wlan_rx_done(void *buffer, uint16_t len, void *eb)
struct wlan_rxbuf *rxbuf;
irqstate_t flags;
FAR struct wlan_priv_s *priv = &g_wlan_priv;
+ int ret = 0;
if (!priv->ifup)
{
- return 0;
+ goto out;
}
if (len > WLAN_BUF_SIZE)
{
nwarn("ERROR: Wlan receive %d larger than %d\n",
len, WLAN_BUF_SIZE);
- return -EINVAL;
+ ret = -EINVAL;
+ goto out;
}
rxbuf = wlan_alloc_buffer(priv);
if (!rxbuf)
{
- if (eb)
- {
- esp_wifi_free_eb(eb);
- }
-
- return -ENOBUFS;
+ ret = -ENOBUFS;
+ goto out;
}
memcpy(rxbuf->buffer, buffer, len);
@@ -525,6 +523,14 @@ static int wlan_rx_done(void *buffer, uint16_t len, void *eb)
}
return 0;
+
+out:
+ if (eb)
+ {
+ esp_wifi_free_eb(eb);
+ }
+
+ return ret;
}
/****************************************************************************