This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch master updated. glibc-2.28.9000-243-g57da2a2
- From: sthibaul at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 31 Oct 2018 09:33:15 -0000
- Subject: GNU C Library master sources branch master updated. glibc-2.28.9000-243-g57da2a2
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via 57da2a23951b1c5dbea3e9ceea60d50020141592 (commit)
via 62c482e93f407bcc7971547742094301374b841e (commit)
via 32ad5b3328e0ce53ca27e185a89ca44c1d0acd0c (commit)
from 3ed7c33fa2915008ec861f25b2d54a0ccc59ca21 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=57da2a23951b1c5dbea3e9ceea60d50020141592
commit 57da2a23951b1c5dbea3e9ceea60d50020141592
Merge: 62c482e 3ed7c33
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: Wed Oct 31 09:19:28 2018 +0100
Merge branch 'master' of git://sourceware.org/git/glibc
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=62c482e93f407bcc7971547742094301374b841e
commit 62c482e93f407bcc7971547742094301374b841e
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: Sun Oct 28 12:55:24 2018 +0100
hurd: Fix cancellation just before RPC call
* sysdeps/mach/hurd/i386/intr-msg.h (INTR_MSG_TRAP): Set
intr_port to 0 when canceled.
* hurd/intr-msg.c (_hurd_intr_rpc_mach_msg): Pass intr_port
address.
diff --git a/ChangeLog b/ChangeLog
index 365ca36..5709c3c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,11 +5,11 @@
answer to interrupt_operation, return EIO instead of EINTR.
* 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.
+ assembly snippet. Make it check canceled flag.
+ * 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.
+ issue, remove cancel flag check.
2018-10-26 Joseph Myers <joseph@codesourcery.com>
diff --git a/hurd/intr-msg.c b/hurd/intr-msg.c
index c347d90..7ace0a1 100644
--- a/hurd/intr-msg.c
+++ b/hurd/intr-msg.c
@@ -116,7 +116,8 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
/* Note that the signal trampoline code might modify our OPTION! */
err = INTR_MSG_TRAP (msg, option, send_size,
- rcv_size, rcv_name, timeout, notify, &ss->cancel);
+ rcv_size, rcv_name, timeout, notify,
+ &ss->cancel, &ss->intr_port);
switch (err)
{
diff --git a/sysdeps/mach/hurd/i386/intr-msg.h b/sysdeps/mach/hurd/i386/intr-msg.h
index baa9ba9..7788c3b 100644
--- a/sysdeps/mach/hurd/i386/intr-msg.h
+++ b/sysdeps/mach/hurd/i386/intr-msg.h
@@ -23,7 +23,7 @@
/* 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) \
+#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_about_to\n" \
@@ -31,17 +31,18 @@
".globl _hurd_intr_rpc_msg_do_trap\n" \
".globl _hurd_intr_rpc_msg_in_trap\n" \
".globl _hurd_intr_rpc_msg_sp_restored\n" \
- "_hurd_intr_rpc_msg_about_to: cmpl $0, %4\n" \
+ "_hurd_intr_rpc_msg_about_to: cmpl $0, %5\n" \
" jz _hurd_intr_rpc_msg_do\n" \
- " movl %5, %%eax\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 %3, %%esp\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) \
+ : "=a" (err), "+m" (option), "+m" (timeout), "=m" (*intr_port_p) \
: "m" ((&msg)[-1]), "m" (*cancel_p), "i" (EINTR) \
: "ecx"); \
err; \
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=32ad5b3328e0ce53ca27e185a89ca44c1d0acd0c
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.
diff --git a/ChangeLog b/ChangeLog
index 7d23aa7..365ca36 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,13 @@
* hurd/hurdsig.c (_hurd_interrupted_rpc_timeout): Set to 60000.
* hurd/intr-msg.c (_hurd_intr_rpc_mach_msg): When the server does not
answer to interrupt_operation, return EIO instead of EINTR.
+ * 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.
2018-10-26 Joseph Myers <joseph@codesourcery.com>
diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c
index 48179b4..d105615 100644
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -292,6 +292,7 @@ _hurdsig_abort_rpcs (struct hurd_sigstate *ss, int signo, int sigthread,
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;
@@ -307,7 +308,8 @@ _hurdsig_abort_rpcs (struct hurd_sigstate *ss, int signo, int sigthread,
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
diff --git a/hurd/intr-msg.c b/hurd/intr-msg.c
index 1f7724e..c347d90 100644
--- a/hurd/intr-msg.c
+++ b/hurd/intr-msg.c
@@ -114,23 +114,9 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
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);
switch (err)
{
diff --git a/sysdeps/mach/hurd/i386/intr-msg.h b/sysdeps/mach/hurd/i386/intr-msg.h
index 64f05f8..baa9ba9 100644
--- a/sysdeps/mach/hurd/i386/intr-msg.h
+++ b/sysdeps/mach/hurd/i386/intr-msg.h
@@ -20,21 +20,29 @@
/* 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) \
({ \
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" \
+ "_hurd_intr_rpc_msg_about_to: cmpl $0, %4\n" \
+ " jz _hurd_intr_rpc_msg_do\n" \
+ " movl %5, %%eax\n" \
+ " jmp _hurd_intr_rpc_msg_sp_restored\n" \
+ "_hurd_intr_rpc_msg_do: movl %%esp, %%ecx\n" \
" leal %3, %%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]) \
+ : "m" ((&msg)[-1]), "m" (*cancel_p), "i" (EINTR) \
: "ecx"); \
err; \
})
-----------------------------------------------------------------------
Summary of changes:
hooks/post-receive
--
GNU C Library master sources