Merge "Simplify our trivial initgroups(), and add a test." into main am: 76cab44ab1 am: 886193648e

Original change: https://android-review.googlesource.com/c/platform/bionic/+/2961910

Change-Id: If888b50abe9187cf8578608fa589dc357bc459a2
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Elliott Hughes 2024-02-16 00:15:42 +00:00 committed by Automerger Merge Worker
commit 243d421837
4 changed files with 13 additions and 59 deletions

View file

@ -857,7 +857,6 @@ cc_library_static {
"bionic/iconv.cpp",
"bionic/icu_wrappers.cpp",
"bionic/ifaddrs.cpp",
"bionic/initgroups.c",
"bionic/inotify_init.cpp",
"bionic/ioctl.cpp",
"bionic/isatty.cpp",

View file

@ -609,6 +609,8 @@ int getpwuid_r(uid_t uid, passwd* pwd, char* buf, size_t byte_count, passwd** re
}
// All users are in just one group, the one passed in.
// In practice, id(1) will show you in a lot more groups, because adbd
// adds you to a lot of supplementary groups when dropping privileges.
int getgrouplist(const char* /*user*/, gid_t group, gid_t* groups, int* ngroups) {
if (*ngroups < 1) {
*ngroups = 1;
@ -618,6 +620,12 @@ int getgrouplist(const char* /*user*/, gid_t group, gid_t* groups, int* ngroups)
return (*ngroups = 1);
}
// See getgrouplist() to understand why we don't call it.
int initgroups(const char* /*user*/, gid_t group) {
gid_t groups[] = {group};
return setgroups(1, groups);
}
char* getlogin() { // NOLINT: implementing bad function.
passwd *pw = getpwuid(getuid()); // NOLINT: implementing bad function in terms of bad function.
return pw ? pw->pw_name : nullptr;

View file

@ -1,58 +0,0 @@
/*
* Copyright (C) 2008 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <grp.h>
#include <unistd.h>
#include <stdlib.h>
#define INIT_GROUPS 2
int
initgroups (const char *user, gid_t group)
{
gid_t groups0[ INIT_GROUPS ];
gid_t* groups = groups0;
int ret = -1;
int numgroups = INIT_GROUPS;
if (getgrouplist(user, group, groups, &numgroups) < 0) {
groups = malloc(numgroups*sizeof(groups[0]));
if (groups == NULL)
return -1;
if (getgrouplist(user,group,groups,&numgroups) < 0) {
goto EXIT;
}
}
ret = setgroups(numgroups, groups);
EXIT:
if (groups != groups0)
free(groups);
return ret;
}

View file

@ -851,6 +851,11 @@ TEST(grp, getgrouplist) {
#endif
}
TEST(grp, initgroups) {
if (getuid() != 0) GTEST_SKIP() << "test requires root";
ASSERT_EQ(0, initgroups("root", 0));
}
#if defined(__BIONIC__)
static void TestAidNamePrefix(const std::string& file_path) {
std::string file_contents;