MSG_EXAMINE has been broadened to allow the signal thread (for
example) to access additional arguments that are passed to
interruptible RPCs in other threads. All architecture specific
variants of intr-msg.h now comply with the revised interface and the
single user of MSG_EXAMINE (report-wait.c) adjusted accordingly.
---
 hurd/report-wait.c                  | 15 ++++++++++++-
 sysdeps/mach/hurd/i386/intr-msg.h   | 35 ++++++++++++++---------------
 sysdeps/mach/hurd/x86_64/intr-msg.h | 19 +++++++---------
 3 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/hurd/report-wait.c b/hurd/report-wait.c
index 3f141345f4..703482c6cc 100644
--- a/hurd/report-wait.c
+++ b/hurd/report-wait.c
@@ -155,16 +155,29 @@ _S_msg_report_wait (mach_port_t msgport, thread_t thread,
          assert (count == MACHINE_THREAD_STATE_COUNT);
          if (SYSCALL_EXAMINE (&state, msgid))
            {
+             mach_msg_header_t* msghdr;
              mach_port_t send_port, rcv_port;
+             mach_msg_size_t rcv_sz;
              mach_msg_option_t option;
              mach_msg_timeout_t timeout;
 
              /* Blocked in a system call.  */
              if (*msgid == -25
                  /* mach_msg system call.  Examine its parameters.  */
-                 && MSG_EXAMINE (&state, msgid, &rcv_port, &send_port,
+                 && MSG_EXAMINE (&state, &msghdr, &rcv_port, &rcv_sz,
                                  &option, &timeout) == 0)
                {
+                 if (msghdr != NULL)
+                   {
+                     send_port = msghdr->msgh_remote_port;
+                     *msgid = msghdr->msgh_id;
+                   }
+                 else
+                   {
+                     send_port = MACH_PORT_NULL;
+                     *msgid = 0;
+                   }
+
                  if (send_port != MACH_PORT_NULL && *msgid != 0)
                    {
                      /* For the normal case of RPCs, we consider the
diff --git a/sysdeps/mach/hurd/i386/intr-msg.h 
b/sysdeps/mach/hurd/i386/intr-msg.h
index e8acf63bd0..5b9a35d526 100644
--- a/sysdeps/mach/hurd/i386/intr-msg.h
+++ b/sysdeps/mach/hurd/i386/intr-msg.h
@@ -106,30 +106,29 @@ struct mach_msg_trap_args
 
 
 /* This cannot be an inline function because it calls setjmp.  */
-#define MSG_EXAMINE(state, msgid, rcvname, send_name, opt, tmout)            \
+#define MSG_EXAMINE(state, msghdr, rcvname, rcvsz, opt, tmout)               \
 ({                                                                           \
   const struct mach_msg_trap_args *args = (const void *) (state)->uesp;        
      \
-  mach_msg_header_t *msg;                                                    \
-  _hurdsig_catch_memory_fault (args) ? -1 :                                  \
-    ({                                                                       \
-      msg = args->msg;                                                       \
+  int ret = _hurdsig_catch_memory_fault (args) ? -1 : 0;                     \
+  if (ret == 0)                                                                
      \
+    {                                                                        \
+      mach_msg_header_t *msg = args->msg;                                    \
+      *(msghdr) = msg;                                                       \
       *(opt) = args->option;                                                 \
       *(tmout) = args->timeout;                                                
      \
       *(rcvname) = args->rcv_name;                                           \
+      *(rcvsz) = args->rcv_size;                                             \
       _hurdsig_end_catch_fault ();                                           \
-      if (msg == 0)                                                          \
+      if (msg != NULL)                                                       \
        {                                                                     \
-         *(send_name) = MACH_PORT_NULL;                                      \
-         *(msgid) = 0;                                                       \
+         ret = _hurdsig_catch_memory_fault (msg) ? -1 : 0;                   \
+         if (ret == 0)                                                       \
+           {                                                                 \
+             /* Access memory at msg to ensure validity */                   \
+             *((volatile mach_msg_id_t *) &msg->msgh_id) = msg->msgh_id;     \
+             _hurdsig_end_catch_fault ();                                    \
+           }                                                                 \
        }                                                                     \
-      else                                                                   \
-       {                                                                     \
-         if (_hurdsig_catch_memory_fault (msg))                              \
-           return -1;                                                        \
-         *(send_name) = msg->msgh_remote_port;                               \
-         *(msgid) = msg->msgh_id;                                            \
-         _hurdsig_end_catch_fault ();                                        \
-       }                                                                     \
-      0;                                                                     \
-    });                                                                        
      \
+    }                                                                        \
+    ret;                                                                     \
 })
diff --git a/sysdeps/mach/hurd/x86_64/intr-msg.h 
b/sysdeps/mach/hurd/x86_64/intr-msg.h
index 82cc78eeb5..6f0ea90ded 100644
--- a/sysdeps/mach/hurd/x86_64/intr-msg.h
+++ b/sysdeps/mach/hurd/x86_64/intr-msg.h
@@ -92,27 +92,24 @@
 
 
 /* This cannot be an inline function because it calls setjmp.  */
-#define MSG_EXAMINE(state, msgid, rcvname, send_name, opt, tmout)            \
+#define MSG_EXAMINE(state, msghdr, rcvname, rcvsz, opt, tmout)               \
 ({                                                                           \
   int ret = 0;                                                               \
   const struct machine_thread_state *s = (state);                            \
-  const mach_msg_header_t *msg = (const void *) s->rdi;                        
      \
+  mach_msg_header_t *msg = (void *) s->rdi;                                  \
+  *(msghdr) = msg;                                                           \
   *(rcvname) = s->r8;                                                        \
   *(opt) = s->rsi;                                                           \
   *(tmout) = s->r9;                                                          \
-  if (msg == 0)                                                                
      \
-    {                                                                        \
-      *(send_name) = MACH_PORT_NULL;                                         \
-      *(msgid) = 0;                                                          \
-    }                                                                        \
-  else                                                                       \
+  *(rcvsz) = s->r10;                                                         \
+  if (msg != NULL)                                                           \
     {                                                                        \
       ret = _hurdsig_catch_memory_fault (msg) ? -1 : 0;                        
      \
       if (ret == 0)                                                          \
         {                                                                    \
-          *(send_name) = msg->msgh_remote_port;                                
      \
-          *(msgid) = msg->msgh_id;                                           \
-          _hurdsig_end_catch_fault ();                                       \
+           /* Access memory at msg to ensure validity */                     \
+           *((volatile mach_msg_id_t *) &msg->msgh_id) = msg->msgh_id;       \
+           _hurdsig_end_catch_fault ();                                      \
        }                                                                     \
     }                                                                        \
   ret;                                                                       \
-- 
2.47.3


Reply via email to