summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Cruz <flaviocruz@gmail.com>2023-05-01 22:52:19 -0400
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-05-02 07:54:29 +0200
commit61dfca567e982f2d6a0a25b04e9eb78adcaac370 (patch)
tree0a086f0da68541cc7ebf36e427ceee56c1447fc4
parent42e5d73459400e81dd7c22ff4c226ab3ec728348 (diff)
Implement mig_deallocate to free memory when kernel server RPC succeeds
In case the kernel interfaces use dynamically sized strings, we will end up calling mig_deallocate to free the out of line string that was copied into the kernel. As a matter of contract such type of data is freed automatically either in kernel code when the RPC fails or in the MiG stub if it succeeds. This was tested by changing task_set_name to use dynamic strings and making sure out of line data is passed when strlen(name) > 4. Message-Id: <ZFB64/0vOJ3x15ub@jupiter.tail36e24.ts.net>
-rw-r--r--kern/ipc_mig.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/kern/ipc_mig.c b/kern/ipc_mig.c
index d6171877..df8a9467 100644
--- a/kern/ipc_mig.c
+++ b/kern/ipc_mig.c
@@ -304,6 +304,16 @@ mig_strncpy(char *dest, const char *src, vm_size_t len)
return dest - dest_;
}
+/* Called by MiG to deallocate memory, which in this case happens
+ * to be kernel memory. */
+void
+mig_deallocate(vm_address_t addr, vm_size_t size)
+{
+ (void) size;
+ /* We do the same thing as in ipc_kmsg_clean_body. */
+ vm_map_copy_discard((vm_map_copy_t) addr);
+}
+
#define fast_send_right_lookup(name, port, abort) \
MACRO_BEGIN \
ipc_space_t space = current_space(); \