This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[hurd,commited 2/3] hurd: Return EIO on non-responding interrupted servers
- From: Samuel Thibault <samuel dot thibault at ens-lyon dot org>
- To: libc-alpha at sourceware dot org
- Cc: Samuel Thibault <samuel dot thibault at ens-lyon dot org>, commit-hurd at gnu dot org
- Date: Sun, 28 Oct 2018 14:38:19 +0100
- Subject: [hurd,commited 2/3] hurd: Return EIO on non-responding interrupted servers
- References: <20181028133820.11856-1-samuel.thibault@ens-lyon.org>
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 <samuel.thibault@ens-lyon.org>
* 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 <joseph@codesourcery.com>
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