[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 ?" -+-
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [PATCH hurd 26/30] utils/rpctrace: make `trace_and_forward' payload-aware,
Samuel Thibault <=