bug-hurd
[Top][All Lists]
Advanced

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

Re: [PATCH hurd 26/30] utils/rpctrace: make `trace_and_forward' payload-


From: Samuel Thibault
Subject: Re: [PATCH hurd 26/30] utils/rpctrace: make `trace_and_forward' payload-aware
Date: Tue, 2 Dec 2014 01:13:00 +0100
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

Justus Winter, le Thu 27 Nov 2014 14:19:06 +0100, a écrit :
> As the protected payloads were retrofitted into the Mach message
> format, the local port type is lost.
> 
> * utils/rpctrace.c (is_notification): New function
> (trace_and_forward): Recover the original local port type.

Ack.

> ---
>  utils/rpctrace.c | 29 ++++++++++++++++++++++++++++-
>  1 file changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/utils/rpctrace.c b/utils/rpctrace.c
> index c954e51..62d3c87 100644
> --- a/utils/rpctrace.c
> +++ b/utils/rpctrace.c
> @@ -1195,6 +1195,16 @@ wrap_new_task (mach_msg_header_t *inp, struct req_info 
> *req)
>    ports_port_deref (task_wrapper1);
>  }
>  
> +/* Returns true if the given message is a Mach notification.  */
> +static inline int
> +is_notification (const mach_msg_header_t *InHeadP)
> +{
> +  int msgh_id = InHeadP->msgh_id - 64;
> +  if ((msgh_id > 8) || (msgh_id < 0))
> +    return 0;
> +  return 1;
> +}
> +
>  int
>  trace_and_forward (mach_msg_header_t *inp, mach_msg_header_t *outp)
>  {
> @@ -1219,7 +1229,24 @@ trace_and_forward (mach_msg_header_t *inp, 
> mach_msg_header_t *outp)
>    /* Look up our record for the receiving port.  There is no need to check
>       the class, because our port bucket only ever contains one class of
>       ports (traced_class).  */
> -  info = ports_lookup_port (traced_bucket, inp->msgh_local_port, 0);
> +
> +  if (MACH_MSGH_BITS_LOCAL (inp->msgh_bits) == 
> MACH_MSG_TYPE_PROTECTED_PAYLOAD)
> +    {
> +      info = ports_lookup_payload (traced_bucket, 
> inp->msgh_protected_payload,
> +                                NULL);
> +      if (info)
> +     {
> +       /* Undo the protected payload optimization.  */
> +       inp->msgh_bits = MACH_MSGH_BITS (
> +         MACH_MSGH_BITS_REMOTE (inp->msgh_bits),
> +         is_notification (inp)? MACH_MSG_TYPE_MOVE_SEND_ONCE: info->type)
> +         | MACH_MSGH_BITS_OTHER (inp->msgh_bits);
> +       inp->msgh_local_port = ports_payload_get_name (info);
> +     }
> +    }
> +  else
> +    info = ports_lookup_port (traced_bucket, inp->msgh_local_port, NULL);
> +
>    assert (info);
>  
>    /* A notification message from the kernel appears to have been sent
> -- 
> 2.1.3
> 

-- 
Samuel
Linux, c'est simple : ça s'adresse à une machine qui est parfois un peu
maraboutée mais qui d'habitude n'a pas d'états d'âme. Sur Usenet y'a
plein d'humains et de primates, et ça devient vraiment gore par moment.
-+- TP in : Guide du linuxien pervers - "Le linuxien a-t-il une âme ?" -+-



reply via email to

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