From 2d0d1d38761cd9aeb7063c5cce1993cec909f67f Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Tue, 9 Oct 2018 22:25:19 +0200 Subject: 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. --- hurd/intr-msg.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'hurd') 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; -- cgit v1.2.3