You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/01/31 10:41:57 UTC
[nuttx] branch master updated: net/devif: check the net device before use
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 7fce145b30 net/devif: check the net device before use
7fce145b30 is described below
commit 7fce145b3043e7ee13c72286674d51e9888935c3
Author: chao an <an...@xiaomi.com>
AuthorDate: Mon Jan 30 21:36:39 2023 +0800
net/devif: check the net device before use
Signed-off-by: chao an <an...@xiaomi.com>
---
net/devif/devif_iobsend.c | 76 +++++++++++++++++++++--------------------------
net/devif/devif_send.c | 62 +++++++++++++++++++++-----------------
2 files changed, 68 insertions(+), 70 deletions(-)
diff --git a/net/devif/devif_iobsend.c b/net/devif/devif_iobsend.c
index 55db92f053..1dd068841a 100644
--- a/net/devif/devif_iobsend.c
+++ b/net/devif/devif_iobsend.c
@@ -27,6 +27,7 @@
#include <string.h>
#include <assert.h>
#include <debug.h>
+#include <errno.h>
#include <nuttx/mm/iob.h>
#include <nuttx/net/netdev.h>
@@ -56,67 +57,58 @@ void devif_iob_send(FAR struct net_driver_s *dev, FAR struct iob_s *iob,
unsigned int len, unsigned int offset,
unsigned int target_offset)
{
-#ifndef CONFIG_NET_IPFRAG
- unsigned int limit = NETDEV_PKTSIZE(dev) -
- NET_LL_HDRLEN(dev) - target_offset;
+ int ret;
- if (dev == NULL || len == 0 || len > limit)
-#else
- if (dev == NULL || len == 0)
-#endif
+ if (dev == NULL)
{
- if (dev->d_iob == NULL)
- {
- iob_free_chain(iob);
- }
+ ret = -ENODEV;
+ goto errout;
+ }
+
+ if (len == 0)
+ {
+ ret = -EINVAL;
+ goto errout;
+ }
#ifndef CONFIG_NET_IPFRAG
- nerr("devif_iob_send error, %p, send len: %u, limit len: %u\n",
- dev, len, limit);
-#else
- nerr("devif_iob_send error, %p, send len: %u\n", dev, len);
-#endif
- return;
+ if (len > NETDEV_PKTSIZE(dev) - NET_LL_HDRLEN(dev) - target_offset)
+ {
+ ret = -EMSGSIZE;
+ goto errout;
}
+#endif
/* Append the send buffer after device buffer */
- if (dev->d_iob != NULL)
+ if (len > iob_navail(false) * CONFIG_IOB_BUFSIZE)
{
- dev->d_sndlen = 0;
-
- if (len > iob_navail(false) * CONFIG_IOB_BUFSIZE)
- {
- return;
- }
-
- /* Clone the iob to target device buffer */
+ ret = -ENOMEM;
+ goto errout;
+ }
- if (iob_clone_partial(iob, len, offset, dev->d_iob,
- target_offset, false, false) != OK)
- {
- netdev_iob_release(dev);
- nerr("devif_iob_send error, not enough iob entries, "
- "send len: %u\n", len);
- return;
- }
+ /* Clone the iob to target device buffer */
- dev->d_sndlen = len;
- }
- else
+ ret = iob_clone_partial(iob, len, offset, dev->d_iob,
+ target_offset, false, false);
+ if (ret != OK)
{
- /* Send the iob directly if no device buffer */
-
- dev->d_iob = iob;
- dev->d_sndlen = len;
- dev->d_buf = NETLLBUF;
+ netdev_iob_release(dev);
+ goto errout;
}
+ dev->d_sndlen = len;
+
#ifdef CONFIG_NET_TCP_WRBUFFER_DUMP
/* Dump the outgoing device buffer */
lib_dumpbuffer("devif_iob_send", dev->d_appdata, len);
#endif
+
+ return;
+
+errout:
+ nerr("ERROR: devif_iob_send error: %d\n", ret);
}
#endif /* CONFIG_MM_IOB */
diff --git a/net/devif/devif_send.c b/net/devif/devif_send.c
index 4c0faca0a7..f2532c42de 100644
--- a/net/devif/devif_send.c
+++ b/net/devif/devif_send.c
@@ -44,6 +44,7 @@
#include <string.h>
#include <assert.h>
#include <debug.h>
+#include <errno.h>
#include <nuttx/net/netdev.h>
@@ -68,47 +69,52 @@
void devif_send(FAR struct net_driver_s *dev, FAR const void *buf,
int len, unsigned int offset)
{
-#ifndef CONFIG_NET_IPFRAG
- unsigned int limit = NETDEV_PKTSIZE(dev) -
- NET_LL_HDRLEN(dev) - offset;
+ int ret;
- if (dev == NULL || len == 0 || len > limit)
+ if (dev == NULL)
{
- nerr("ERROR: devif_send fail: %p, sndlen: %u, pktlen: %u\n",
- dev, len, limit);
- return;
+ ret = -ENODEV;
+ goto errout;
}
-#else
- if (dev == NULL || len == 0)
+
+ if (len == 0)
{
- nerr("ERROR: devif_send fail: %p, sndlen: %u\n", dev, len);
- return;
+ ret = -EINVAL;
+ goto errout;
}
-#endif
-
- /* Copy in iob to target device buffer */
- if (len <= iob_navail(false) * CONFIG_IOB_BUFSIZE)
+#ifndef CONFIG_NET_IPFRAG
+ if (len > NETDEV_PKTSIZE(dev) - NET_LL_HDRLEN(dev) - offset)
{
- /* Prepare device buffer before poll callback */
-
- if (netdev_iob_prepare(dev, false, 0) != OK)
- {
- return;
- }
+ ret = -EMSGSIZE;
+ goto errout;
+ }
+#endif
- iob_update_pktlen(dev->d_iob, offset);
+ /* Append the send buffer after device buffer */
- dev->d_sndlen = iob_trycopyin(dev->d_iob, buf, len, offset, false);
- }
- else
+ if (len > iob_navail(false) * CONFIG_IOB_BUFSIZE &&
+ netdev_iob_prepare(dev, false, 0) != OK)
{
- dev->d_sndlen = 0;
+ ret = -ENOMEM;
+ goto errout;
}
- if (dev->d_sndlen != len)
+ /* Prepare device buffer before poll callback */
+
+ iob_update_pktlen(dev->d_iob, offset);
+
+ ret = iob_trycopyin(dev->d_iob, buf, len, offset, false);
+ if (ret != len)
{
netdev_iob_release(dev);
- dev->d_sndlen = 0;
+ goto errout;
}
+
+ dev->d_sndlen = len;
+
+ return;
+
+errout:
+ nerr("ERROR: devif_send error: %d\n", ret);
}