GNU C Library master sources branch master updated. glibc-2.28.9000-243-g57da2a2

sthibaul@sourceware.org sthibaul@sourceware.org
Wed Oct 31 09:33:00 GMT 2018


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



More information about the Glibc-cvs mailing list