From 365b32bb6e167320694a364564c3ab6409a21283 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Wed, 29 May 2024 17:35:51 -0400 Subject: [PATCH] kernel/team: Set team arguments during load_image/exec_team. This way, by the time we send a notification, the arguments are already set even if the main thread has not yet started. Fixes #12703. Change-Id: Ib93b4b16bffa8cb943cf6389f0f72dce89f9749b Reviewed-on: https://review.haiku-os.org/c/haiku/+/7702 Tested-by: Commit checker robot Reviewed-by: waddlesplash --- src/system/kernel/team.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/system/kernel/team.cpp b/src/system/kernel/team.cpp index bb3ef42123..2740a9c3b5 100644 --- a/src/system/kernel/team.cpp +++ b/src/system/kernel/team.cpp @@ -1636,18 +1636,17 @@ team_create_thread_start_internal(void* args) return B_BAD_ADDRESS; } - TRACE(("team_create_thread_start: loading elf binary '%s'\n", path)); - - // set team args and update state - team->Lock(); - team->SetArgs(path, teamArgs->flat_args + 1, argCount - 1); - team->state = TEAM_STATE_NORMAL; - team->Unlock(); - free_team_arg(teamArgs); // the arguments are already on the user stack, we no longer need // them in this form + TRACE(("team_create_thread_start: loading elf binary '%s'\n", path)); + + // update state + team->Lock(); + team->state = TEAM_STATE_NORMAL; + team->Unlock(); + // Clone commpage area area_id commPageArea = clone_commpage_area(team->id, &team->commpage_address); @@ -1808,6 +1807,8 @@ load_image_internal(char**& _flatArgs, size_t flatArgsSize, int32 argCount, _flatArgs = NULL; // args are owned by the team_arg structure now + team->SetArgs(path, teamArgs->flat_args + 1, argCount - 1); + // create a new io_context for this team team->io_context = vfs_new_io_context(parentIOContext, true); if (!team->io_context) { @@ -2014,6 +2015,8 @@ exec_team(const char* path, char**& _flatArgs, size_t flatArgsSize, _flatArgs = NULL; // args are owned by the team_arg structure now + team->SetArgs(path, teamArgs->flat_args + 1, argCount - 1); + // TODO: remove team resources if there are any left // thread_atkernel_exit() might not be called at all