diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-10-09 22:25:19 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-10-28 10:25:44 +0100 |
commit | 2d0d1d38761cd9aeb7063c5cce1993cec909f67f (patch) | |
tree | f2fb36f0ff93ccde48f55fb92c90c1d7b5eab60b /hurd/intr-msg.c | |
parent | 46a7f24c84299bb1ad63de725f67d1df5dffc2dc (diff) | |
download | glibc-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.c | 14 |
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; |