summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <teythoon@avior.uberspace.de>2017-10-26 17:38:30 +0200
committerJustus Winter <teythoon@avior.uberspace.de>2017-10-26 18:25:12 +0200
commit10ebf9565f69760e46a8f271e22c5367d54e10ff (patch)
tree4c60dcf6e2056d50f2da1ca2cc889ff41f7138c3
parentd7d4740699431889f44fc7ce16f083eaa31f907e (diff)
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.
-rw-r--r--kern/bootstrap.c2
-rw-r--r--kern/task.c28
-rw-r--r--kern/task.h4
3 files changed, 32 insertions, 2 deletions
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,16 +73,42 @@ 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;
#if FAST_TAS
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(