summaryrefslogtreecommitdiff
path: root/debian/patches/0023-utils-rpctrace-make-trace_and_forward-payload-aware.patch
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2014-12-01 22:24:07 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-12-01 22:24:07 +0100
commit98436554dde9ed58ff56bc1f8b9afdebdec1fd53 (patch)
treee3cd1733a34d880c162f44a7e29c022f2cd1ff2d /debian/patches/0023-utils-rpctrace-make-trace_and_forward-payload-aware.patch
parent127b9d289d134e1220f61d4face082981da4e68d (diff)
add patch series
Diffstat (limited to 'debian/patches/0023-utils-rpctrace-make-trace_and_forward-payload-aware.patch')
-rw-r--r--debian/patches/0023-utils-rpctrace-make-trace_and_forward-payload-aware.patch65
1 files changed, 65 insertions, 0 deletions
diff --git a/debian/patches/0023-utils-rpctrace-make-trace_and_forward-payload-aware.patch b/debian/patches/0023-utils-rpctrace-make-trace_and_forward-payload-aware.patch
new file mode 100644
index 00000000..3b7c2458
--- /dev/null
+++ b/debian/patches/0023-utils-rpctrace-make-trace_and_forward-payload-aware.patch
@@ -0,0 +1,65 @@
+From 2f8b47d3c7d991f9f030dd688b2bffb2f228d48a 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 23/27] 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
+