commit-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[hurd, commited 2/3] hurd: Return EIO on non-responding interrupted serv


From: Samuel Thibault
Subject: [hurd, commited 2/3] hurd: Return EIO on non-responding interrupted servers
Date: Sun, 28 Oct 2018 14:38:19 +0100

since we do not actually know whether the RPC was completed or not,
which makes a huge difference for e.g. write(), so better really error
out than letting caller think that the RPC did not happen.

        * hurd/intr-msg.c (_hurd_intr_rpc_mach_msg): When the server does not
        answer to interrupt_operation, return EIO instead of EINTR.
---
 ChangeLog       |  2 ++
 hurd/intr-msg.c | 14 +++++++++-----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 79255d3795..7d23aa7236 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,8 @@
 2018-10-28  Samuel Thibault  <address@hidden>
 
        * hurd/hurdsig.c (_hurd_interrupted_rpc_timeout): Set to 60000.
+       * hurd/intr-msg.c (_hurd_intr_rpc_mach_msg): When the server does not
+       answer to interrupt_operation, return EIO instead of EINTR.
 
 2018-10-26  Joseph Myers  <address@hidden>
 
diff --git a/hurd/intr-msg.c b/hurd/intr-msg.c
index 2f83ac6ce7..1f7724ee8b 100644
--- a/hurd/intr-msg.c
+++ b/hurd/intr-msg.c
@@ -141,7 +141,7 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
       else
        /* The operation was supposedly interrupted, but still has
           not returned.  Declare it interrupted.  */
-       goto interrupted;
+       goto dead;
 
     case MACH_SEND_INTERRUPTED: /* RPC didn't get out.  */
       if (!(option & MACH_SEND_MSG))
@@ -324,17 +324,21 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
          timeout = user_timeout;
          goto message;
        }
-      /* FALLTHROUGH */
+      err = EINTR;
+
+      /* The EINTR return indicates cancellation, so clear the flag.  */
+      ss->cancel = 0;
+      break;
 
     case MACH_RCV_PORT_DIED:
       /* Server didn't respond to interrupt_operation,
         so the signal thread destroyed the reply port.  */
       /* FALLTHROUGH */
 
-    interrupted:
-      err = EINTR;
+    dead:
+      err = EIO;
 
-      /* The EINTR return indicates cancellation, so clear the flag.  */
+      /* The EIO return indicates cancellation, so clear the flag.  */
       ss->cancel = 0;
       break;
 
-- 
2.19.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]