diff --git a/syscall/process_syscall.c b/syscall/process_syscall.c index 467bd1a4fdceb2bbe5248614856f3ba09d5195ac..b54f8bb83cf3a476d715e9028d7d8076506ebed3 100644 --- a/syscall/process_syscall.c +++ b/syscall/process_syscall.c @@ -683,12 +683,12 @@ int SysGetGroupID(void) } #ifdef LOSCFG_SECURITY_CAPABILITY -static int SetGroups(int size, const int *safeList) +static int SetGroups(int listSize, const int *safeList, int size) { User *oldUser = NULL; unsigned int intSave; - User *newUser = LOS_MemAlloc(m_aucSysMem1, sizeof(User) + size * sizeof(int)); + User *newUser = LOS_MemAlloc(m_aucSysMem1, sizeof(User) + listSize * sizeof(int)); if (newUser == NULL) { return -ENOMEM; } @@ -696,11 +696,14 @@ static int SetGroups(int size, const int *safeList) SCHEDULER_LOCK(intSave); oldUser = OsCurrUserGet(); (VOID)memcpy_s(newUser, sizeof(User), oldUser, sizeof(User)); - if (size != 0) { + if (safeList != NULL) { (VOID)memcpy_s(newUser->groups, size * sizeof(int), safeList, size * sizeof(int)); } - - newUser->groupNumber = size; + if (listSize == size) { + newUser->groups[listSize] = oldUser->gid; + } + + newUser->groupNumber = listSize + 1; OsCurrProcessGet()->user = newUser; SCHEDULER_UNLOCK(intSave); @@ -721,7 +724,7 @@ static int GetGroups(int size, int list[]) SCHEDULER_UNLOCK(intSave); listSize = groupCount * sizeof(int); - if ((size == 0) || (groupCount == 0)) { + if (size == 0) { return groupCount; } else if (list == NULL) { return -EFAULT; @@ -779,6 +782,7 @@ int SysSetGroups(int size, const int list[]) #ifdef LOSCFG_SECURITY_CAPABILITY int ret; int gid; + int listSize = size; unsigned int count; int *safeList = NULL; #endif @@ -809,14 +813,16 @@ int SysSetGroups(int size, const int list[]) } gid = OsCurrUserGet()->gid; for (count = 0; count < size; count++) { - if (safeList[count] < 0) { + if (safeList[count] == gid) { + listSize = size - 1; + } else if (safeList[count] < 0) { ret = -EINVAL; goto EXIT; } } } - ret = SetGroups(size, safeList); + ret = SetGroups(listSize, safeList, size); EXIT: if (safeList != NULL) { (void)LOS_MemFree(m_aucSysMem1, safeList);