bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2] proc: fix the receiver lookup in S_proc_exception_raise


From: Justus Winter
Subject: [PATCH 2/2] proc: fix the receiver lookup in S_proc_exception_raise
Date: Sat, 18 Jan 2014 18:19:26 +0100

* proc/mgt.c (S_proc_exception_raise): Update accordingly.
* proc/mig-decls.h: New file.
* proc/proc_exc.defs: Add translation functions.
---
 proc/mgt.c         |  7 ++-----
 proc/mig-decls.h   | 42 ++++++++++++++++++++++++++++++++++++++++++
 proc/proc_exc.defs |  8 +++++++-
 3 files changed, 51 insertions(+), 6 deletions(-)
 create mode 100644 proc/mig-decls.h

diff --git a/proc/mgt.c b/proc/mgt.c
index 602ba84..5e0accd 100644
--- a/proc/mgt.c
+++ b/proc/mgt.c
@@ -417,7 +417,7 @@ S_proc_handle_exceptions (struct proc *p,
    the thread_set_state requested by proc_handle_exceptions and then
    send an exception_raise message as requested. */
 kern_return_t
-S_proc_exception_raise (mach_port_t excport,
+S_proc_exception_raise (struct exc *e,
                        mach_port_t reply,
                        mach_msg_type_name_t reply_type,
                        mach_port_t thread,
@@ -428,8 +428,7 @@ S_proc_exception_raise (mach_port_t excport,
 {
   error_t err;
   struct proc *p;
-  struct exc *e = ports_lookup_port (proc_bucket, excport, exc_class);
-  if (!e)
+  if (!e || e->pi.bucket != proc_bucket || e->pi.class != exc_class)
     return EOPNOTSUPP;
 
   p = task_find (task);
@@ -455,7 +454,6 @@ S_proc_exception_raise (mach_port_t excport,
         the faulting thread's state to run its recovery code, which should
         dequeue that message.  */
       err = thread_set_state (thread, e->flavor, e->thread_state, e->statecnt);
-      ports_port_deref (e);
       mach_port_deallocate (mach_task_self (), thread);
       mach_port_deallocate (mach_task_self (), task);
       if (err)
@@ -484,7 +482,6 @@ S_proc_exception_raise (mach_port_t excport,
       /* Nuke the task; we will get a notification message and report that
         it died with SIGNO.  */
       task_terminate (task);
-      ports_port_deref (e);
 
       /* In the MACH_SEND_NOTIFY_IN_PROGRESS case, the kernel did a
         pseudo-receive of the RPC request message that may have added user
diff --git a/proc/mig-decls.h b/proc/mig-decls.h
new file mode 100644
index 0000000..0d5bd4d
--- /dev/null
+++ b/proc/mig-decls.h
@@ -0,0 +1,42 @@
+/* Translation functions for mig.
+
+   Copyright (C) 2013 Free Software Foundation, Inc.
+
+   Written by Justus Winter <4winter@informatik.uni-hamburg.de>
+
+   This file is part of the GNU Hurd.
+
+   The GNU Hurd is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   The GNU Hurd is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with the GNU Hurd.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef __MIG_DECLS_H__
+#define __MIG_DECLS_H__
+
+#include "proc.h"
+
+typedef struct exc* exc_t;
+
+static inline exc_t __attribute__ ((unused))
+begin_using_exc_port (mach_port_t port)
+{
+  return ports_lookup_port (NULL, port, exc_class);
+}
+
+static inline void __attribute__ ((unused))
+end_using_exc (exc_t exc)
+{
+  if (exc != NULL)
+    ports_port_deref (exc);
+}
+
+#endif
diff --git a/proc/proc_exc.defs b/proc/proc_exc.defs
index e9c58f1..c910824 100644
--- a/proc/proc_exc.defs
+++ b/proc/proc_exc.defs
@@ -33,9 +33,15 @@ subsystem proc_exc 2400;
 #include <mach/std_types.defs>
 
 ServerPrefix S_;
+import "mig-decls.h";
+
+type exception_t = mach_port_copy_send_t
+       cusertype: mach_port_t
+       intran: exc_t begin_using_exc_port (exception_t)
+       destructor: end_using_exc (exc_t);
 
 routine proc_exception_raise (
-       exception_port: mach_port_t;
+       exception_port: exception_t;
        replyport reply: mach_port_poly_t;
        msgoption flags: integer_t;
        thread: mach_port_t;
-- 
1.8.5.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]