linux/kernel/groups.c

// SPDX-License-Identifier: GPL-2.0
/*
 * Supplementary group IDs
 */
#include <linux/cred.h>
#include <linux/export.h>
#include <linux/slab.h>
#include <linux/security.h>
#include <linux/sort.h>
#include <linux/syscalls.h>
#include <linux/user_namespace.h>
#include <linux/vmalloc.h>
#include <linux/uaccess.h>

struct group_info *groups_alloc(int gidsetsize)
{}

EXPORT_SYMBOL();

void groups_free(struct group_info *group_info)
{}

EXPORT_SYMBOL();

/* export the group_info to a user-space array */
static int groups_to_user(gid_t __user *grouplist,
			  const struct group_info *group_info)
{}

/* fill a group_info from a user-space array - it must be allocated already */
static int groups_from_user(struct group_info *group_info,
    gid_t __user *grouplist)
{}

static int gid_cmp(const void *_a, const void *_b)
{}

void groups_sort(struct group_info *group_info)
{}
EXPORT_SYMBOL();

/* a simple bsearch */
int groups_search(const struct group_info *group_info, kgid_t grp)
{}

/**
 * set_groups - Change a group subscription in a set of credentials
 * @new: The newly prepared set of credentials to alter
 * @group_info: The group list to install
 */
void set_groups(struct cred *new, struct group_info *group_info)
{}

EXPORT_SYMBOL();

/**
 * set_current_groups - Change current's group subscription
 * @group_info: The group list to impose
 *
 * Validate a group subscription and, if valid, impose it upon current's task
 * security record.
 */
int set_current_groups(struct group_info *group_info)
{}

EXPORT_SYMBOL();

SYSCALL_DEFINE2(getgroups, int, gidsetsize, gid_t __user *, grouplist)
{}

bool may_setgroups(void)
{}

/*
 *	SMP: Our groups are copy-on-write. We can set them safely
 *	without another task interfering.
 */

SYSCALL_DEFINE2(setgroups, int, gidsetsize, gid_t __user *, grouplist)
{}

/*
 * Check whether we're fsgid/egid or in the supplemental group..
 */
int in_group_p(kgid_t grp)
{}

EXPORT_SYMBOL();

int in_egroup_p(kgid_t grp)
{}

EXPORT_SYMBOL();