diff options
| author | Greg Kroah-Hartman <[email protected]> | 2013-08-12 10:22:49 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <[email protected]> | 2013-08-12 10:22:49 -0700 |
| commit | fbf8d7106c926d375c76e65cc878f4fa7b91cbc3 (patch) | |
| tree | e9faf7f8a9ce8da9ad2e2a3f1768a4af414670d4 /kernel/user_namespace.c | |
| parent | 98f62b7a082e1e9eb762c7329a704316f6e07698 (diff) | |
| parent | d4e4ab86bcba5a72779c43dc1459f71fea3d89c8 (diff) | |
Merge 3.11-rc5 into staging-next
We want the staging fixes in here as well.
Signed-off-by: Greg Kroah-Hartman <[email protected]>
Diffstat (limited to 'kernel/user_namespace.c')
| -rw-r--r-- | kernel/user_namespace.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c index d8c30db06c5b..9064b919a406 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c @@ -62,6 +62,9 @@ int create_user_ns(struct cred *new) kgid_t group = new->egid; int ret; + if (parent_ns->level > 32) + return -EUSERS; + /* * Verify that we can not violate the policy of which files * may be accessed that is specified by the root directory, @@ -92,6 +95,7 @@ int create_user_ns(struct cred *new) atomic_set(&ns->count, 1); /* Leave the new->user_ns reference with the new user namespace. */ ns->parent = parent_ns; + ns->level = parent_ns->level + 1; ns->owner = owner; ns->group = group; @@ -105,16 +109,21 @@ int create_user_ns(struct cred *new) int unshare_userns(unsigned long unshare_flags, struct cred **new_cred) { struct cred *cred; + int err = -ENOMEM; if (!(unshare_flags & CLONE_NEWUSER)) return 0; cred = prepare_creds(); - if (!cred) - return -ENOMEM; + if (cred) { + err = create_user_ns(cred); + if (err) + put_cred(cred); + else + *new_cred = cred; + } - *new_cred = cred; - return create_user_ns(cred); + return err; } void free_user_ns(struct user_namespace *ns) |