Skip to content
Commits on Source (5)
......@@ -108,12 +108,22 @@ glibc (2.28-0experimental0) UNRELEASED; urgency=medium
 
-- Aurelien Jarno <aurel32@debian.org> Sat, 04 Aug 2018 20:13:33 +0200
 
glibc (2.27-7) UNRELEASED; urgency=medium
glibc (2.27-8) UNRELEASED; urgency=medium
* patches/hurd-i386/git-intr-msg.diff: Fix a cancellation case.
-- Samuel Thibault <sthibault@debian.org> Sun, 28 Oct 2018 12:58:28 +0100
glibc (2.27-7) unstable; urgency=medium
 
* patches/hurd-i386/local-no_unsupported_ioctls.diff: Undefine useless bit
macros too.
* patches/hurd-i386/git-interrupt_timeout{,_EIO}.diff: Fix double-writes in
ghc.
* patches/hurd-i386/git-intr-msg.diff: Fix crashes due to a race between
calling RPC and handling a signal.
 
-- Samuel Thibault <sthibault@debian.org> Sun, 30 Sep 2018 20:26:22 +0200
-- Samuel Thibault <sthibault@debian.org> Sun, 28 Oct 2018 10:46:23 +0100
 
glibc (2.27-6) unstable; urgency=medium
 
......
commit 6849ff19657e8f7e6a83e9aaae07eb45269dc7d4
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: Tue Oct 9 22:27:59 2018 +0200
hurd: set interrupt timeout to 1 minute
Seeing a server not able to get interrupted for 3s is not so surprising when
e.g. a lot of writes are happening. 1 minute allows to actually notice the
issue and be able to debug it.
* hurd/hurdsig.c (_hurd_interrupted_rpc_timeout): Set to 60000.
---
hurd/hurdsig.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -56,7 +56,7 @@ struct hurd_sigstate *_hurd_sigstates;
struct hurd_sigstate *_hurd_global_sigstate;
/* Timeout for RPC's after interrupt_operation. */
-mach_msg_timeout_t _hurd_interrupted_rpc_timeout = 3000;
+mach_msg_timeout_t _hurd_interrupted_rpc_timeout = 60000;
static void
default_sigaction (struct sigaction actions[NSIG])
commit 16d61b858ec0e802008d721e150e48d6083d3921
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: Tue Oct 9 22:25:19 2018 +0200
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.
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;
commit 32ad5b3328e0ce53ca27e185a89ca44c1d0acd0c
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: Tue Oct 9 23:40:09 2018 +0200
hurd: Fix race between calling RPC and handling a signal
* sysdeps/mach/hurd/i386/intr-msg.h (INTR_MSG_TRAP): Make
_hurd_intr_rpc_msg_about_to global point to start of controlled
assembly snippet. Make it check canceled flag again.
* hurd/hurdsig.c (_hurdsig_abort_rpcs): Only mutate thread if it passed the
_hurd_intr_rpc_msg_about_to point.
* hurd/intr-msg.c (_hurd_intr_rpc_mach_msg): Remove comment on mutation
issue.
---
hurd/hurdsig.c | 4 +++-
hurd/intr-msg.c | 17 ++---------------
sysdeps/mach/hurd/i386/intr-msg.h | 23 ++++++++++++++++-------
3 files changed, 21 insertions(+), 23 deletions(-)
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -439,6 +439,7 @@ _hurdsig_abort_rpcs (struct hurd_sigstat
struct machine_thread_all_state *state, int *state_change,
void (*reply) (void))
{
+ extern const void _hurd_intr_rpc_msg_about_to;
extern const void _hurd_intr_rpc_msg_in_trap;
mach_port_t rcv_port = MACH_PORT_NULL;
mach_port_t intr_port;
@@ -454,7 +455,8 @@ _hurdsig_abort_rpcs (struct hurd_sigstat
receive completes immediately or aborts. */
abort_thread (ss, state, reply);
- if (state->basic.PC < (natural_t) &_hurd_intr_rpc_msg_in_trap)
+ if (state->basic.PC >= (natural_t) &_hurd_intr_rpc_msg_about_to &&
+ state->basic.PC < (natural_t) &_hurd_intr_rpc_msg_in_trap)
{
/* The thread is about to do the RPC, but hasn't yet entered
mach_msg. Mutate the thread's state so it knows not to try
--- a/hurd/intr-msg.c
+++ b/hurd/intr-msg.c
@@ -114,23 +114,10 @@ _hurd_intr_rpc_mach_msg (mach_msg_header
message:
- /* XXX
- At all points here (once SS->intr_port is set), the signal thread
- thinks we are "about to enter the syscall", and might mutate our
- return-value register. This is bogus.
- */
-
- if (ss->cancel)
- {
- /* We have been cancelled. Don't do an RPC at all. */
- ss->intr_port = MACH_PORT_NULL;
- ss->cancel = 0;
- return EINTR;
- }
-
/* Note that the signal trampoline code might modify our OPTION! */
err = INTR_MSG_TRAP (msg, option, send_size,
- rcv_size, rcv_name, timeout, notify);
+ rcv_size, rcv_name, timeout, notify,
+ &ss->cancel, &ss->intr_port);
switch (err)
{
--- a/sysdeps/mach/hurd/i386/intr-msg.h
+++ b/sysdeps/mach/hurd/i386/intr-msg.h
@@ -20,21 +20,30 @@
/* Note that we must mark OPTION and TIMEOUT as outputs of this operation,
to indicate that the signal thread might mutate them as part
of sending us to a signal handler. */
-#define INTR_MSG_TRAP(msg, option, send_size, rcv_size, rcv_name, timeout, notify) \
+
+/* After _hurd_intr_rpc_msg_about_to we need to make a last check of cancel, in
+ case we got interrupted right before _hurd_intr_rpc_msg_about_to. */
+#define INTR_MSG_TRAP(msg, option, send_size, rcv_size, rcv_name, timeout, notify, cancel_p, intr_port_p) \
({ \
error_t err; \
- asm (".globl _hurd_intr_rpc_msg_do_trap\n" \
- ".globl _hurd_intr_rpc_msg_in_trap\n" \
+ asm (".globl _hurd_intr_rpc_msg_about_to\n" \
".globl _hurd_intr_rpc_msg_cx_sp\n" \
+ ".globl _hurd_intr_rpc_msg_do_trap\n" \
+ ".globl _hurd_intr_rpc_msg_in_trap\n" \
".globl _hurd_intr_rpc_msg_sp_restored\n" \
- " movl %%esp, %%ecx\n" \
- " leal %3, %%esp\n" \
+ "_hurd_intr_rpc_msg_about_to: cmpl $0, %5\n" \
+ " jz _hurd_intr_rpc_msg_do\n" \
+ " movl $0, %3\n" \
+ " movl %6, %%eax\n" \
+ " jmp _hurd_intr_rpc_msg_sp_restored\n" \
+ "_hurd_intr_rpc_msg_do: movl %%esp, %%ecx\n" \
+ " leal %4, %%esp\n" \
"_hurd_intr_rpc_msg_cx_sp: movl $-25, %%eax\n" \
"_hurd_intr_rpc_msg_do_trap: lcall $7, $0 # status in %0\n" \
"_hurd_intr_rpc_msg_in_trap: movl %%ecx, %%esp\n" \
"_hurd_intr_rpc_msg_sp_restored:" \
- : "=a" (err), "+m" (option), "+m" (timeout) \
- : "m" ((&msg)[-1]) \
+ : "=a" (err), "+m" (option), "+m" (timeout), "=m" (*intr_port_p) \
+ : "m" ((&msg)[-1]), "m" (*cancel_p), "i" (EINTR) \
: "ecx"); \
err; \
})
......@@ -83,6 +83,9 @@ hurd-i386/local-no_unsupported_ioctls.diff
hurd-i386/local-exec_filename.diff
#hurd-i386/libpthread_sigs.diff
hurd-i386/local-hurd_sigstate-PLT.diff
hurd-i386/git-interrupt_timeout_EIO.diff
hurd-i386/git-interrupt_timeout.diff
hurd-i386/git-intr-msg.diff
i386/local-biarch.diff
i386/unsubmitted-quiet-ldconfig.diff
......