bug-hurd
[Top][All Lists]
Advanced

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

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


From: Samuel Thibault
Subject: Re: [PATCH 2/2] proc: fix the receiver lookup in S_proc_exception_raise
Date: Sun, 19 Jan 2014 21:14:03 +0100
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

Justus Winter, le Sat 18 Jan 2014 18:19:26 +0100, a écrit :
> * proc/mgt.c (S_proc_exception_raise): Update accordingly.
> * proc/mig-decls.h: New file.
> * proc/proc_exc.defs: Add translation functions.

Why putting translation functions into proc_exc, rather than using
mutation?

> ---
>  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
> 

-- 
Samuel
«Tiens, quand j'aurai un peu de temps et une partition libre, je crois
 que je vais essayer de remplacer mes scripts de démarrage par des
 programmes Windows lancés via Wine et binfmt_misc :-)»
-+- AGV in Guide du linuxien pervers - "J'sais pas quoi faire... (air connu)"



reply via email to

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