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-02 00:29:37 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-12-02 00:29:37 +0100
commitdf1a438eae4acd80c9a9ac8cfcf596ff21adef1c (patch)
treea9bf557001bfaddf46da6fdc49293b0d02715718 /debian/patches/0023-utils-rpctrace-make-trace_and_forward-payload-aware.patch
parent370e931feb0f74481b30236a11e8de95f2cba8d6 (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..2074689b
--- /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/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
+