aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/Android.bp1
-rw-r--r--libc/bionic/grp_pwd.cpp8
-rw-r--r--libc/bionic/initgroups.c58
-rw-r--r--tests/grp_pwd_test.cpp5
4 files changed, 13 insertions, 59 deletions
diff --git a/libc/Android.bp b/libc/Android.bp
index 048cd7394..071f309fa 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -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",
diff --git a/libc/bionic/grp_pwd.cpp b/libc/bionic/grp_pwd.cpp
index 600693c74..82ee7bae9 100644
--- a/libc/bionic/grp_pwd.cpp
+++ b/libc/bionic/grp_pwd.cpp
@@ -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;
diff --git a/libc/bionic/initgroups.c b/libc/bionic/initgroups.c
deleted file mode 100644
index dea6d966d..000000000
--- a/libc/bionic/initgroups.c
+++ /dev/null
@@ -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;
-}
diff --git a/tests/grp_pwd_test.cpp b/tests/grp_pwd_test.cpp
index d3acf03d1..16b8d5ac5 100644
--- a/tests/grp_pwd_test.cpp
+++ b/tests/grp_pwd_test.cpp
@@ -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;