summaryrefslogtreecommitdiff
path: root/debian/patches/protected_payload.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/protected_payload.patch')
-rw-r--r--debian/patches/protected_payload.patch81
1 files changed, 81 insertions, 0 deletions
diff --git a/debian/patches/protected_payload.patch b/debian/patches/protected_payload.patch
index 2a03e23..85e464e 100644
--- a/debian/patches/protected_payload.patch
+++ b/debian/patches/protected_payload.patch
@@ -450,6 +450,87 @@ index 41fe3de..dbeacff 100644
assert((bits & MACH_PORT_TYPE_RECEIVE) == 0);
if (bits & MACH_PORT_TYPE_SEND) {
+diff --git a/ipc/mach_msg.c b/ipc/mach_msg.c
+index 78247a4..783b2b4 100644
+--- a/ipc/mach_msg.c
++++ b/ipc/mach_msg.c
+@@ -1132,11 +1132,19 @@ mach_msg_trap(msg, option, send_size, rcv_size, rcv_name, time_out, notify)
+ } else
+ ip_unlock(dest_port);
+
+- kmsg->ikm_header.msgh_bits =
+- MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE,
+- MACH_MSG_TYPE_PORT_SEND);
++ if (! ipc_port_flag_protected_payload(dest_port)) {
++ kmsg->ikm_header.msgh_bits = MACH_MSGH_BITS(
++ MACH_MSG_TYPE_PORT_SEND_ONCE,
++ MACH_MSG_TYPE_PORT_SEND);
++ kmsg->ikm_header.msgh_local_port = dest_name;
++ } else {
++ kmsg->ikm_header.msgh_bits = MACH_MSGH_BITS(
++ MACH_MSG_TYPE_PORT_SEND_ONCE,
++ MACH_MSG_TYPE_PROTECTED_PAYLOAD);
++ kmsg->ikm_header.msgh_protected_payload =
++ dest_port->ip_protected_payload;
++ }
+ kmsg->ikm_header.msgh_remote_port = reply_name;
+- kmsg->ikm_header.msgh_local_port = dest_name;
+ goto fast_put;
+
+ abort_request_copyout:
+@@ -1170,11 +1178,19 @@ mach_msg_trap(msg, option, send_size, rcv_size, rcv_name, time_out, notify)
+ dest_name = MACH_PORT_NULL;
+ }
+
+- kmsg->ikm_header.msgh_bits =
+- MACH_MSGH_BITS(0,
+- MACH_MSG_TYPE_PORT_SEND_ONCE);
++ if (! ipc_port_flag_protected_payload(dest_port)) {
++ kmsg->ikm_header.msgh_bits = MACH_MSGH_BITS(
++ 0,
++ MACH_MSG_TYPE_PORT_SEND_ONCE);
++ kmsg->ikm_header.msgh_local_port = dest_name;
++ } else {
++ kmsg->ikm_header.msgh_bits = MACH_MSGH_BITS(
++ 0,
++ MACH_MSG_TYPE_PROTECTED_PAYLOAD);
++ kmsg->ikm_header.msgh_protected_payload =
++ dest_port->ip_protected_payload;
++ }
+ kmsg->ikm_header.msgh_remote_port = MACH_PORT_NULL;
+- kmsg->ikm_header.msgh_local_port = dest_name;
+ goto fast_put;
+ }
+
+@@ -1204,12 +1220,23 @@ mach_msg_trap(msg, option, send_size, rcv_size, rcv_name, time_out, notify)
+ dest_name = MACH_PORT_NULL;
+ }
+
+- kmsg->ikm_header.msgh_bits =
+- MACH_MSGH_BITS_COMPLEX |
+- MACH_MSGH_BITS(0,
+- MACH_MSG_TYPE_PORT_SEND_ONCE);
++ if (! ipc_port_flag_protected_payload(dest_port)) {
++ kmsg->ikm_header.msgh_bits =
++ MACH_MSGH_BITS_COMPLEX
++ | MACH_MSGH_BITS(
++ 0,
++ MACH_MSG_TYPE_PORT_SEND_ONCE);
++ kmsg->ikm_header.msgh_local_port = dest_name;
++ } else {
++ kmsg->ikm_header.msgh_bits =
++ MACH_MSGH_BITS_COMPLEX
++ | MACH_MSGH_BITS(
++ 0,
++ MACH_MSG_TYPE_PROTECTED_PAYLOAD);
++ kmsg->ikm_header.msgh_protected_payload =
++ dest_port->ip_protected_payload;
++ }
+ kmsg->ikm_header.msgh_remote_port = MACH_PORT_NULL;
+- kmsg->ikm_header.msgh_local_port = dest_name;
+
+ mr = ipc_kmsg_copyout_body(
+ (vm_offset_t) (&kmsg->ikm_header + 1),
diff --git a/ipc/mach_port.c b/ipc/mach_port.c
index 13572a1..057278b 100644
--- a/ipc/mach_port.c