← Commit list

748b16815

Denys Vlasenko
Denys Vlasenko
2024-10-07
SUCCESS Duration: 158s

Subject

libbb: move is_in_supplementary_groups() from test to libbb

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

coreutils/test.c+1 -19
@@ -637,32 +637,14 @@ static int binop(void)
/*return 1; - NOTREACHED */
}
-static void initialize_group_array(void)
-{
- group_array = bb_getgroups(&ngroups, NULL);
-}
-
/* Return non-zero if GID is one that we have in our groups list. */
-//XXX: FIXME: duplicate of existing libbb function?
-// see toplevel TODO file:
-// possible code duplication ingroup() and is_a_group_member()
static int is_a_group_member(gid_t gid)
{
- int i;
-
/* Short-circuit if possible, maybe saving a call to getgroups(). */
if (gid == getgid() || gid == getegid())
return 1;
- if (ngroups == 0)
- initialize_group_array();
-
- /* Search through the list looking for GID. */
- for (i = 0; i < ngroups; i++)
- if (gid == group_array[i])
- return 1;
-
- return 0;
+ return is_in_supplementary_groups(&ngroups, &group_array, gid);
}
/*
include/libbb.h+5 -0
@@ -1201,6 +1201,11 @@ void die_if_bad_username(const char* name) FAST_FUNC;
* Dies on errors (on Linux, only xrealloc can cause this, not internal getgroups call).
*/
gid_t *bb_getgroups(int *ngroups, gid_t *group_array) FAST_FUNC;
+/*
+ * True if GID is in our getgroups() result.
+ * getgroups() is cached in group_array[], to makse successive calls faster.
+ */
+int FAST_FUNC is_in_supplementary_groups(int *pngroups, gid_t **pgroup_array, gid_t gid);
#if ENABLE_FEATURE_UTMP
void FAST_FUNC write_new_utmp(pid_t pid, int new_type, const char *tty_name, const char *username, const char *hostname);
libbb/bb_getgroups.c+20 -0
@@ -45,3 +45,23 @@ gid_t* FAST_FUNC bb_getgroups(int *ngroups, gid_t *group_array)
*ngroups = n;
return group_array;
}
+
+/* Return non-zero if GID is in our supplementary group list. */
+int FAST_FUNC is_in_supplementary_groups(int *pngroups, gid_t **pgroup_array, gid_t gid)
+{
+ int i;
+ int ngroups;
+ gid_t *group_array;
+
+ if (*pngroups == 0)
+ *pgroup_array = bb_getgroups(pngroups, NULL);
+ ngroups = *pngroups;
+ group_array = *pgroup_array;
+
+ /* Search through the list looking for GID. */
+ for (i = 0; i < ngroups; i++)
+ if (gid == group_array[i])
+ return 1;
+
+ return 0;
+}