You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by pk...@apache.org on 2022/06/28 03:19:19 UTC

[incubator-nuttx] branch master updated: net: Ensure sendmsg and sendfile return -EAGAIN in case of timeout

This is an automated email from the ASF dual-hosted git repository.

pkarashchenko 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 abc72ad128 net: Ensure sendmsg and sendfile return -EAGAIN in case of timeout
abc72ad128 is described below

commit abc72ad12818b98e3b89172379cbdbda6fd7a3d9
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Mon Jun 27 08:04:32 2022 +0800

    net: Ensure sendmsg and sendfile return -EAGAIN in case of timeout
    
    instead of -ETIMEOUT, as specify here:
    https://pubs.opengroup.org/onlinepubs/009604599/functions/sendmsg.html
    https://man7.org/linux/man-pages/man2/sendfile.2.html
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
 net/icmp/icmp_sendmsg.c           |  4 ++++
 net/icmpv6/icmpv6_sendmsg.c       |  4 ++++
 net/sixlowpan/sixlowpan_send.c    |  1 +
 net/sixlowpan/sixlowpan_tcpsend.c |  5 +++++
 net/tcp/tcp_send_unbuffered.c     |  5 +++++
 net/tcp/tcp_sendfile.c            |  5 +++++
 sched/mqueue/mq_send.c            |  2 +-
 sched/mqueue/mq_sndinternal.c     | 12 ++++++------
 sched/mqueue/mq_timedsend.c       |  2 +-
 9 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/net/icmp/icmp_sendmsg.c b/net/icmp/icmp_sendmsg.c
index 17097526ff..c9b8d3c720 100644
--- a/net/icmp/icmp_sendmsg.c
+++ b/net/icmp/icmp_sendmsg.c
@@ -439,6 +439,10 @@ ssize_t icmp_sendmsg(FAR struct socket *psock, FAR struct msghdr *msg,
 
                   ret = -ENETUNREACH;
                 }
+              else
+                {
+                  ret = -EAGAIN;
+                }
             }
 
           state.snd_result = ret;
diff --git a/net/icmpv6/icmpv6_sendmsg.c b/net/icmpv6/icmpv6_sendmsg.c
index 0471fa5e03..c6dfbbc848 100644
--- a/net/icmpv6/icmpv6_sendmsg.c
+++ b/net/icmpv6/icmpv6_sendmsg.c
@@ -430,6 +430,10 @@ ssize_t icmpv6_sendmsg(FAR struct socket *psock, FAR struct msghdr *msg,
 
                   ret = -ENETUNREACH;
                 }
+              else
+                {
+                  ret = -EAGAIN;
+                }
             }
 
           state.snd_result = ret;
diff --git a/net/sixlowpan/sixlowpan_send.c b/net/sixlowpan/sixlowpan_send.c
index 5587797398..e76b9fd620 100644
--- a/net/sixlowpan/sixlowpan_send.c
+++ b/net/sixlowpan/sixlowpan_send.c
@@ -258,6 +258,7 @@ int sixlowpan_send(FAR struct net_driver_s *dev,
             {
               if (ret == -ETIMEDOUT)
                 {
+                  ret = -EAGAIN;
                   neighbor_notreachable(dev);
                 }
 
diff --git a/net/sixlowpan/sixlowpan_tcpsend.c b/net/sixlowpan/sixlowpan_tcpsend.c
index 02d4b92ea4..cd6e4009c6 100644
--- a/net/sixlowpan/sixlowpan_tcpsend.c
+++ b/net/sixlowpan/sixlowpan_tcpsend.c
@@ -660,6 +660,11 @@ static int sixlowpan_send_packet(FAR struct socket *psock,
               ret = net_timedwait(&sinfo.s_waitsem, timeout);
               if (ret != -ETIMEDOUT || acked == sinfo.s_acked)
                 {
+                  if (ret == -ETIMEDOUT)
+                    {
+                      ret = -EAGAIN;
+                    }
+
                   break; /* Timeout without any progress */
                 }
             }
diff --git a/net/tcp/tcp_send_unbuffered.c b/net/tcp/tcp_send_unbuffered.c
index 3c8d478d9f..2b28081d43 100644
--- a/net/tcp/tcp_send_unbuffered.c
+++ b/net/tcp/tcp_send_unbuffered.c
@@ -680,6 +680,11 @@ ssize_t psock_tcp_send(FAR struct socket *psock,
                                   _SO_TIMEOUT(conn->sconn.s_sndtimeo));
               if (ret != -ETIMEDOUT || acked == state.snd_acked)
                 {
+                  if (ret == -ETIMEDOUT)
+                    {
+                      ret = -EAGAIN;
+                    }
+
                   break; /* Timeout without any progress */
                 }
             }
diff --git a/net/tcp/tcp_sendfile.c b/net/tcp/tcp_sendfile.c
index 509301fb75..54ee14af71 100644
--- a/net/tcp/tcp_sendfile.c
+++ b/net/tcp/tcp_sendfile.c
@@ -583,6 +583,11 @@ ssize_t tcp_sendfile(FAR struct socket *psock, FAR struct file *infile,
               &state.snd_sem, _SO_TIMEOUT(conn->sconn.s_sndtimeo));
       if (ret != -ETIMEDOUT || acked == state.snd_acked)
         {
+          if (ret == -ETIMEDOUT)
+            {
+              ret = -EAGAIN;
+            }
+
           break; /* Successful completion or timeout without any progress */
         }
     }
diff --git a/sched/mqueue/mq_send.c b/sched/mqueue/mq_send.c
index 8fed5373cd..60eb932fc1 100644
--- a/sched/mqueue/mq_send.c
+++ b/sched/mqueue/mq_send.c
@@ -91,7 +91,7 @@ int file_mq_send(FAR struct file *mq, FAR const char *msg, size_t msglen,
    * - Immediately if we are called from an interrupt handler.
    * - Immediately if the message queue is not full, or
    * - After successfully waiting for the message queue to become
-   *   non-FULL.  This would fail with EAGAIN, EINTR, or ETIMEOUT.
+   *   non-FULL.  This would fail with EAGAIN, EINTR, or ETIMEDOUT.
    */
 
   flags = enter_critical_section();
diff --git a/sched/mqueue/mq_sndinternal.c b/sched/mqueue/mq_sndinternal.c
index 1a53c6d287..45cefbf2cc 100644
--- a/sched/mqueue/mq_sndinternal.c
+++ b/sched/mqueue/mq_sndinternal.c
@@ -198,11 +198,11 @@ FAR struct mqueue_msg_s *nxmq_alloc_msg(void)
  *   On success, nxmq_wait_send() returns 0 (OK); a negated errno value is
  *   returned on any failure:
  *
- *   EAGAIN   The queue was full and the O_NONBLOCK flag was set for the
- *            message queue description referred to by msgq.
- *   EINTR    The call was interrupted by a signal handler.
- *   ETIMEOUT A timeout expired before the message queue became non-full
- *            (mq_timedsend only).
+ *   EAGAIN    The queue was full and the O_NONBLOCK flag was set for the
+ *             message queue description referred to by msgq.
+ *   EINTR     The call was interrupted by a signal handler.
+ *   ETIMEDOUT A timeout expired before the message queue became non-full
+ *             (mq_timedsend only).
  *
  * Assumptions/restrictions:
  * - The caller has verified the input parameters using nxmq_verify_send().
@@ -272,7 +272,7 @@ int nxmq_wait_send(FAR struct mqueue_inode_s *msgq, int oflags)
       /* When we resume at this point, either (1) the message queue
        * is no longer empty, or (2) the wait has been interrupted by
        * a signal.  We can detect the latter case be examining the
-       * per-task errno value (should be EINTR or ETIMEOUT).
+       * per-task errno value (should be EINTR or ETIMEDOUT).
        */
 
       if (rtcb->errcode != OK)
diff --git a/sched/mqueue/mq_timedsend.c b/sched/mqueue/mq_timedsend.c
index 9db57621c8..b671a7fb50 100644
--- a/sched/mqueue/mq_timedsend.c
+++ b/sched/mqueue/mq_timedsend.c
@@ -251,7 +251,7 @@ int file_mq_timedsend(FAR struct file *mq, FAR const char *msg,
   ret = nxmq_wait_send(msgq, mq->f_oflags);
 
   /* This may return with an error and errno set to either EINTR
-   * or ETIMEOUT.  Cancel the watchdog timer in any event.
+   * or ETIMEDOUT.  Cancel the watchdog timer in any event.
    */
 
   wd_cancel(&rtcb->waitdog);