From 10ebf9565f69760e46a8f271e22c5367d54e10ff Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Thu, 26 Oct 2017 17:38:30 +0200 Subject: kern: Fix crash. Check receiver in task_create. Fixes a crash when sending that message to a non-task port. * kern/bootstrap.c (boot_script_task_create): Use the new function. * kern/task.c (task_create): Rename to task_create_internal, create a new function in its place that checks the receiver first. * kern/task.h (task_create_internal): New prototype. --- kern/bootstrap.c | 2 +- kern/task.c | 28 +++++++++++++++++++++++++++- kern/task.h | 4 ++++ 3 files changed, 32 insertions(+), 2 deletions(-) (limited to 'kern') diff --git a/kern/bootstrap.c b/kern/bootstrap.c index 18b6b182..8b88d17d 100644 --- a/kern/bootstrap.c +++ b/kern/bootstrap.c @@ -819,7 +819,7 @@ boot_script_free (void *ptr, unsigned int size) int boot_script_task_create (struct cmd *cmd) { - kern_return_t rc = task_create(TASK_NULL, FALSE, &cmd->task); + kern_return_t rc = task_create_kernel(TASK_NULL, FALSE, &cmd->task); if (rc) { printf("boot_script_task_create failed with %x\n", rc); diff --git a/kern/task.c b/kern/task.c index 1874af69..681ce872 100644 --- a/kern/task.c +++ b/kern/task.c @@ -73,15 +73,41 @@ void task_init(void) * Task_create must assign to kernel_task as a side effect, * for other initialization. (:-() */ - (void) task_create(TASK_NULL, FALSE, &kernel_task); + (void) task_create_kernel(TASK_NULL, FALSE, &kernel_task); (void) task_set_name(kernel_task, "gnumach"); vm_map_set_name(kernel_map, kernel_task->name); } +int +task_ledger_acquire (task_t task, enum ledger_kind kind) +{ + return ledger_acquire (task->ledgers, kind); +} + +void +task_ledger_release (task_t task, enum ledger_kind kind) +{ + ledger_release (task->ledgers, kind); +} + + kern_return_t task_create( task_t parent_task, boolean_t inherit_memory, task_t *child_task) /* OUT */ +{ + if (parent_task == TASK_NULL) + return KERN_INVALID_TASK; + + return task_create_kernel (parent_task, inherit_memory, + child_task); +} + +kern_return_t +task_create_kernel( + task_t parent_task, + boolean_t inherit_memory, + task_t *child_task) /* OUT */ { task_t new_task; processor_set_t pset; diff --git a/kern/task.h b/kern/task.h index 2a4c28fc..0b746aff 100644 --- a/kern/task.h +++ b/kern/task.h @@ -140,6 +140,10 @@ extern kern_return_t task_create( task_t parent_task, boolean_t inherit_memory, task_t *child_task); +extern kern_return_t task_create_kernel( + task_t parent_task, + boolean_t inherit_memory, + task_t *child_task); extern kern_return_t task_terminate( task_t task); extern kern_return_t task_suspend( -- cgit v1.2.3