diff options
Diffstat (limited to 'debian/patches/0026-utils-rpctrace-make-trace_and_forward-payload-aware.patch')
-rw-r--r-- | debian/patches/0026-utils-rpctrace-make-trace_and_forward-payload-aware.patch | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/debian/patches/0026-utils-rpctrace-make-trace_and_forward-payload-aware.patch b/debian/patches/0026-utils-rpctrace-make-trace_and_forward-payload-aware.patch new file mode 100644 index 00000000..5e9c80ef --- /dev/null +++ b/debian/patches/0026-utils-rpctrace-make-trace_and_forward-payload-aware.patch @@ -0,0 +1,65 @@ +From 69eb2161897b5b3c6b592ef78a947449b0890f7c Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Thu, 28 Nov 2013 12:21:49 +0100 +Subject: [PATCH hurd 26/29] utils/rpctrace: make `trace_and_forward' + payload-aware + +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. +--- + 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 + |