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:
commit
243d421837
4 changed files with 13 additions and 59 deletions
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue