mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
Pull user namespace rlimit handling update from Eric Biederman: "This is the work mainly by Alexey Gladkov to limit rlimits to the rlimits of the user that created a user namespace, and to allow users to have stricter limits on the resources created within a user namespace." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace: cred: add missing return error code when set_cred_ucounts() failed ucounts: Silence warning in dec_rlimit_ucounts ucounts: Set ucount_max to the largest positive value the type can hold kselftests: Add test to check for rlimit changes in different user namespaces Reimplement RLIMIT_MEMLOCK on top of ucounts Reimplement RLIMIT_SIGPENDING on top of ucounts Reimplement RLIMIT_MSGQUEUE on top of ucounts Reimplement RLIMIT_NPROC on top of ucounts Use atomic_t for ucounts reference counting Add a reference to ucounts for each cred Increase size of ucounts to atomic_long_t
This commit is contained in:
@@ -54,9 +54,15 @@ enum ucount_type {
|
||||
UCOUNT_FANOTIFY_GROUPS,
|
||||
UCOUNT_FANOTIFY_MARKS,
|
||||
#endif
|
||||
UCOUNT_RLIMIT_NPROC,
|
||||
UCOUNT_RLIMIT_MSGQUEUE,
|
||||
UCOUNT_RLIMIT_SIGPENDING,
|
||||
UCOUNT_RLIMIT_MEMLOCK,
|
||||
UCOUNT_COUNTS,
|
||||
};
|
||||
|
||||
#define MAX_PER_NAMESPACE_UCOUNTS UCOUNT_RLIMIT_NPROC
|
||||
|
||||
struct user_namespace {
|
||||
struct uid_gid_map uid_map;
|
||||
struct uid_gid_map gid_map;
|
||||
@@ -92,23 +98,42 @@ struct user_namespace {
|
||||
struct ctl_table_header *sysctls;
|
||||
#endif
|
||||
struct ucounts *ucounts;
|
||||
int ucount_max[UCOUNT_COUNTS];
|
||||
long ucount_max[UCOUNT_COUNTS];
|
||||
} __randomize_layout;
|
||||
|
||||
struct ucounts {
|
||||
struct hlist_node node;
|
||||
struct user_namespace *ns;
|
||||
kuid_t uid;
|
||||
int count;
|
||||
atomic_t ucount[UCOUNT_COUNTS];
|
||||
atomic_t count;
|
||||
atomic_long_t ucount[UCOUNT_COUNTS];
|
||||
};
|
||||
|
||||
extern struct user_namespace init_user_ns;
|
||||
extern struct ucounts init_ucounts;
|
||||
|
||||
bool setup_userns_sysctls(struct user_namespace *ns);
|
||||
void retire_userns_sysctls(struct user_namespace *ns);
|
||||
struct ucounts *inc_ucount(struct user_namespace *ns, kuid_t uid, enum ucount_type type);
|
||||
void dec_ucount(struct ucounts *ucounts, enum ucount_type type);
|
||||
struct ucounts *alloc_ucounts(struct user_namespace *ns, kuid_t uid);
|
||||
struct ucounts * __must_check get_ucounts(struct ucounts *ucounts);
|
||||
void put_ucounts(struct ucounts *ucounts);
|
||||
|
||||
static inline long get_ucounts_value(struct ucounts *ucounts, enum ucount_type type)
|
||||
{
|
||||
return atomic_long_read(&ucounts->ucount[type]);
|
||||
}
|
||||
|
||||
long inc_rlimit_ucounts(struct ucounts *ucounts, enum ucount_type type, long v);
|
||||
bool dec_rlimit_ucounts(struct ucounts *ucounts, enum ucount_type type, long v);
|
||||
bool is_ucounts_overlimit(struct ucounts *ucounts, enum ucount_type type, unsigned long max);
|
||||
|
||||
static inline void set_rlimit_ucount_max(struct user_namespace *ns,
|
||||
enum ucount_type type, unsigned long max)
|
||||
{
|
||||
ns->ucount_max[type] = max <= LONG_MAX ? max : LONG_MAX;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USER_NS
|
||||
|
||||
|
Reference in New Issue
Block a user