summaryrefslogtreecommitdiff
path: root/debian/patches/0026-utils-rpctrace-make-trace_and_forward-payload-aware.patch
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2014-11-23 23:03:30 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-11-23 23:03:30 +0100
commit4e042fdef179d55b2b61800d02e4e32aceaad361 (patch)
treeddd8be729ce04d871a33bf7752432af9165de6c7 /debian/patches/0026-utils-rpctrace-make-trace_and_forward-payload-aware.patch
parent281d7b6a450ac432b0aa16b23d31e633b73bc53a (diff)
add patch series
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.patch65
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..4194fb82
--- /dev/null
+++ b/debian/patches/0026-utils-rpctrace-make-trace_and_forward-payload-aware.patch
@@ -0,0 +1,65 @@
+From b6bb64d4eb4767a49aa8e1ae713072c92e775bec 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
+