From e372ec1e022c1a71fd524296630b7b78cf799474 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Wed, 9 Feb 2022 16:39:43 -0500 Subject: [PATCH] kernel: Use KernelReferenceable for the supplementary_groups array. Instead of the malloc_referenced system. Makes for some cleaner code, and the malloc_referenced system was only used here, so it can now be dropped altogether. --- headers/private/kernel/thread_types.h | 9 +++++-- src/system/kernel/team.cpp | 6 ----- src/system/kernel/usergroup.cpp | 34 ++++++++++++++------------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/headers/private/kernel/thread_types.h b/headers/private/kernel/thread_types.h index 6ac2bcbcef..556f5bce82 100644 --- a/headers/private/kernel/thread_types.h +++ b/headers/private/kernel/thread_types.h @@ -201,6 +201,12 @@ typedef int32 (*thread_entry_func)(thread_func, void *); namespace BKernel { +struct GroupsArray : KernelReferenceable { + int count; + gid_t groups[]; +}; + + template struct TeamThreadIteratorEntry : DoublyLinkedListLinkImpl > { @@ -287,8 +293,7 @@ struct Team : TeamThreadIteratorEntry, KernelReferenceable, gid_t saved_set_gid; gid_t real_gid; gid_t effective_gid; - gid_t* supplementary_groups; - int supplementary_group_count; + BReference supplementary_groups; // Exit status information. Set when the first terminal event occurs, // immutable afterwards. Protected by fLock. diff --git a/src/system/kernel/team.cpp b/src/system/kernel/team.cpp index a32adebd63..0a8723d75c 100644 --- a/src/system/kernel/team.cpp +++ b/src/system/kernel/team.cpp @@ -462,9 +462,6 @@ Team::Team(team_id id, bool kernel) commpage_address = NULL; - supplementary_groups = NULL; - supplementary_group_count = 0; - dead_threads_kernel_time = 0; dead_threads_user_time = 0; cpu_clock_offset = 0; @@ -541,8 +538,6 @@ Team::~Team() free(entry); } - malloc_referenced_release(supplementary_groups); - delete job_control_entry; // usually already NULL and transferred to the parent @@ -2872,7 +2867,6 @@ team_init(kernel_args* args) sKernelTeam->real_gid = 0; sKernelTeam->effective_gid = 0; sKernelTeam->supplementary_groups = NULL; - sKernelTeam->supplementary_group_count = 0; insert_team_into_group(group, sKernelTeam); diff --git a/src/system/kernel/usergroup.cpp b/src/system/kernel/usergroup.cpp index f2cf198d84..631d98c06d 100644 --- a/src/system/kernel/usergroup.cpp +++ b/src/system/kernel/usergroup.cpp @@ -169,8 +169,13 @@ common_getgroups(int groupCount, gid_t* groupList, bool kernel) TeamLocker teamLocker(team); - const gid_t* groups = team->supplementary_groups; - int actualCount = team->supplementary_group_count; + const gid_t* groups = NULL; + int actualCount = 0; + + if (team->supplementary_groups != NULL) { + groups = team->supplementary_groups->groups; + actualCount = team->supplementary_groups->count; + } // follow the specification and return always at least one group if (actualCount == 0) { @@ -207,36 +212,36 @@ common_setgroups(int groupCount, const gid_t* groupList, bool kernel) if (groupCount < 0 || groupCount > NGROUPS_MAX) return B_BAD_VALUE; - gid_t* newGroups = NULL; + BKernel::GroupsArray* newGroups = NULL; if (groupCount > 0) { - newGroups = (gid_t*)malloc_referenced(sizeof(gid_t) * groupCount); + newGroups = (BKernel::GroupsArray*)malloc(sizeof(BKernel::GroupsArray) + + (sizeof(gid_t) * groupCount)); if (newGroups == NULL) return B_NO_MEMORY; + new(newGroups) BKernel::GroupsArray; if (kernel) { - memcpy(newGroups, groupList, sizeof(gid_t) * groupCount); + memcpy(newGroups->groups, groupList, sizeof(gid_t) * groupCount); } else { if (!IS_USER_ADDRESS(groupList) - || user_memcpy(newGroups, groupList, + || user_memcpy(newGroups->groups, groupList, sizeof(gid_t) * groupCount) != B_OK) { - malloc_referenced_release(newGroups); + delete newGroups; return B_BAD_ADDRESS; } } + newGroups->count = groupCount; } Team* team = thread_get_current_thread()->team; - TeamLocker teamLocker(team); - gid_t* toFree = team->supplementary_groups; - team->supplementary_groups = newGroups; - team->supplementary_group_count = groupCount; + BReference previous = team->supplementary_groups; + // so it will not be (potentially) destroyed until after we unlock + team->supplementary_groups.SetTo(newGroups, true); teamLocker.Unlock(); - malloc_referenced_release(toFree); - return B_OK; } @@ -256,10 +261,7 @@ inherit_parent_user_and_group(Team* team, Team* parent) team->saved_set_gid = parent->saved_set_gid; team->real_gid = parent->real_gid; team->effective_gid = parent->effective_gid; - - malloc_referenced_acquire(parent->supplementary_groups); team->supplementary_groups = parent->supplementary_groups; - team->supplementary_group_count = parent->supplementary_group_count; }