From: GNU Libc Maintainers Date: Wed, 5 Dec 2018 18:50:21 +0000 (+0000) Subject: git-interrupt_timeout_EIO X-Git-Tag: archive/raspbian/2.28-2+rpi1^2~63 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=7ff273dc800cf4189d32c8fe0d6796b92979519d;p=glibc.git git-interrupt_timeout_EIO commit 16d61b858ec0e802008d721e150e48d6083d3921 Author: Samuel Thibault Date: Tue Oct 9 22:25:19 2018 +0200 hurd: Return EIEIO 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 EIEIO instead of EINTR. Gbp-Pq: Topic hurd-i386 Gbp-Pq: Name git-interrupt_timeout_EIO.diff --- diff --git a/hurd/intr-msg.c b/hurd/intr-msg.c index 2f83ac6ce..ec8dc5e1f 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 = EIEIO; - /* The EINTR return indicates cancellation, so clear the flag. */ + /* The EIEIO return indicates cancellation, so clear the flag. */ ss->cancel = 0; break;