aboutsummaryrefslogtreecommitdiff
path: root/hurd/intr-msg.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2018-10-09 22:25:19 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-10-28 10:25:44 +0100
commit2d0d1d38761cd9aeb7063c5cce1993cec909f67f (patch)
treef2fb36f0ff93ccde48f55fb92c90c1d7b5eab60b /hurd/intr-msg.c
parent46a7f24c84299bb1ad63de725f67d1df5dffc2dc (diff)
downloadglibc-2d0d1d38761cd9aeb7063c5cce1993cec909f67f.zip
glibc-2d0d1d38761cd9aeb7063c5cce1993cec909f67f.tar.gz
glibc-2d0d1d38761cd9aeb7063c5cce1993cec909f67f.tar.bz2
hurd: Return EIO on non-responding interrupted servers
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.
Diffstat (limited to 'hurd/intr-msg.c')
-rw-r--r--hurd/intr-msg.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/hurd/intr-msg.c b/hurd/intr-msg.c
index 2f83ac6..1f7724e 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;