diff options
author | Flavio Cruz <flaviocruz@gmail.com> | 2023-05-01 22:52:19 -0400 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-05-02 07:54:29 +0200 |
commit | 61dfca567e982f2d6a0a25b04e9eb78adcaac370 (patch) | |
tree | 0a086f0da68541cc7ebf36e427ceee56c1447fc4 | |
parent | 42e5d73459400e81dd7c22ff4c226ab3ec728348 (diff) | |
download | gnumach-61dfca567e982f2d6a0a25b04e9eb78adcaac370.tar.gz gnumach-61dfca567e982f2d6a0a25b04e9eb78adcaac370.tar.bz2 gnumach-61dfca567e982f2d6a0a25b04e9eb78adcaac370.zip |
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.c | 10 |
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(); \ |