History

userns: Kill nsown_capable it makes the wrong thing easy

nsown_capable is a special case of ns_capable essentially for just CAP_SETUID and CAP_SETGID. For the existing users it doesn't noticably simplify things and from the suggested patches I have seen it encourages people to do the wrong thing. So remove nsown_capable.

Eric W. Biederman committed 13 years ago

Commit c7b96ac1 parent f54fb8612 files · +21 −34Browse files

Unified · Split

12 files
  1. fs/namespace.c +2 −2
  2. fs/open.c +1 −1
  3. include/linux/capability.h +0 −1
  4. ipc/namespace.c +1 −1
  5. kernel/capability.c +0 −12
  6. kernel/groups.c +1 −1
  7. kernel/pid_namespace.c +1 −1
  8. kernel/sys.c +10 −10
  9. kernel/uid16.c +1 −1
  10. kernel/utsname.c +1 −1
  11. net/core/net_namespace.c +1 −1
  12. net/core/scm.c +2 −2
fs/namespace.c+2−2
@@ -2929,8 +2929,8 @@ static int mntns_install(struct nsproxy *nsproxy, void *ns) · 2928 unmodified lines
29292929 struct path root;
29302930
29312931 if (!ns_capable(mnt_ns->user_ns, CAP_SYS_ADMIN) ||
2932− !nsown_capable(CAP_SYS_CHROOT) ||
2933− !nsown_capable(CAP_SYS_ADMIN))
2932+ !ns_capable(current_user_ns(), CAP_SYS_CHROOT) ||
2933+ !ns_capable(current_user_ns(), CAP_SYS_ADMIN))
29342934 return -EPERM;
29352935
29362936 if (fs->users != 1)
fs/open.c+1−1
@@ -443,7 +443,7 @@ retry: · 442 unmodified lines
443443 goto dput_and_out;
444444
445445 error = -EPERM;
446− if (!nsown_capable(CAP_SYS_CHROOT))
446+ if (!ns_capable(current_user_ns(), CAP_SYS_CHROOT))
447447 goto dput_and_out;
448448 error = security_path_chroot(&path);
449449 if (error)
include/linux/capability.h+0−1
@@ -210,7 +210,6 @@ extern bool has_ns_capability_noaudit(struct task_struct *t, · 209 unmodified lines
210210 struct user_namespace *ns, int cap);
211211 extern bool capable(int cap);
212212 extern bool ns_capable(struct user_namespace *ns, int cap);
213−extern bool nsown_capable(int cap);
214213 extern bool inode_capable(const struct inode *inode, int cap);
215214 extern bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap);
216215
ipc/namespace.c+1−1
@@ -171,7 +171,7 @@ static int ipcns_install(struct nsproxy *nsproxy, void *new) · 170 unmodified lines
171171 {
172172 struct ipc_namespace *ns = new;
173173 if (!ns_capable(ns->user_ns, CAP_SYS_ADMIN) ||
174− !nsown_capable(CAP_SYS_ADMIN))
174+ !ns_capable(current_user_ns(), CAP_SYS_ADMIN))
175175 return -EPERM;
176176
177177 /* Ditch state from the old ipc namespace */
kernel/capability.c+0−12
@@ -432,18 +432,6 @@ bool capable(int cap) · 431 unmodified lines
432432 }
433433 EXPORT_SYMBOL(capable);
434434
435−/**
436− * nsown_capable - Check superior capability to one's own user_ns
437− * @cap: The capability in question
438− *
439− * Return true if the current task has the given superior capability
440− * targeted at its own user namespace.
441− */
442−bool nsown_capable(int cap)
443−{
444− return ns_capable(current_user_ns(), cap);
445−}
446−
447435 /**
448436 * inode_capable - Check superior capability over inode
449437 * @inode: The inode in question
kernel/groups.c+1−1
@@ -233,7 +233,7 @@ SYSCALL_DEFINE2(setgroups, int, gidsetsize, gid_t __user *, grouplist) · 232 unmodified lines
233233 struct group_info *group_info;
234234 int retval;
235235
236− if (!nsown_capable(CAP_SETGID))
236+ if (!ns_capable(current_user_ns(), CAP_SETGID))
237237 return -EPERM;
238238 if ((unsigned)gidsetsize > NGROUPS_MAX)
239239 return -EINVAL;
kernel/pid_namespace.c+1−1
@@ -329,7 +329,7 @@ static int pidns_install(struct nsproxy *nsproxy, void *ns) · 328 unmodified lines
329329 struct pid_namespace *ancestor, *new = ns;
330330
331331 if (!ns_capable(new->user_ns, CAP_SYS_ADMIN) ||
332− !nsown_capable(CAP_SYS_ADMIN))
332+ !ns_capable(current_user_ns(), CAP_SYS_ADMIN))
333333 return -EPERM;
334334
335335 /*
kernel/sys.c+10−10
@@ -337,7 +337,7 @@ SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid) · 336 unmodified lines
337337 if (rgid != (gid_t) -1) {
338338 if (gid_eq(old->gid, krgid) ||
339339 gid_eq(old->egid, krgid) ||
340− nsown_capable(CAP_SETGID))
340+ ns_capable(old->user_ns, CAP_SETGID))
341341 new->gid = krgid;
342342 else
343343 goto error;
@@ -346,7 +346,7 @@ SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid) · 2 unmodified lines
346346 if (gid_eq(old->gid, kegid) ||
347347 gid_eq(old->egid, kegid) ||
348348 gid_eq(old->sgid, kegid) ||
349− nsown_capable(CAP_SETGID))
349+ ns_capable(old->user_ns, CAP_SETGID))
350350 new->egid = kegid;
351351 else
352352 goto error;
@@ -387,7 +387,7 @@ SYSCALL_DEFINE1(setgid, gid_t, gid) · 34 unmodified lines
387387 old = current_cred();
388388
389389 retval = -EPERM;
390− if (nsown_capable(CAP_SETGID))
390+ if (ns_capable(old->user_ns, CAP_SETGID))
391391 new->gid = new->egid = new->sgid = new->fsgid = kgid;
392392 else if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->sgid))
393393 new->egid = new->fsgid = kgid;
@@ -471,7 +471,7 @@ SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid) · 77 unmodified lines
471471 new->uid = kruid;
472472 if (!uid_eq(old->uid, kruid) &&
473473 !uid_eq(old->euid, kruid) &&
474− !nsown_capable(CAP_SETUID))
474+ !ns_capable(old->user_ns, CAP_SETUID))
475475 goto error;
476476 }
477477
@@ -480,7 +480,7 @@ SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid) · 2 unmodified lines
480480 if (!uid_eq(old->uid, keuid) &&
481481 !uid_eq(old->euid, keuid) &&
482482 !uid_eq(old->suid, keuid) &&
483− !nsown_capable(CAP_SETUID))
483+ !ns_capable(old->user_ns, CAP_SETUID))
484484 goto error;
485485 }
486486
@@ -534,7 +534,7 @@ SYSCALL_DEFINE1(setuid, uid_t, uid) · 47 unmodified lines
534534 old = current_cred();
535535
536536 retval = -EPERM;
537− if (nsown_capable(CAP_SETUID)) {
537+ if (ns_capable(old->user_ns, CAP_SETUID)) {
538538 new->suid = new->uid = kuid;
539539 if (!uid_eq(kuid, old->uid)) {
540540 retval = set_user(new);
@@ -591,7 +591,7 @@ SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid) · 50 unmodified lines
591591 old = current_cred();
592592
593593 retval = -EPERM;
594− if (!nsown_capable(CAP_SETUID)) {
594+ if (!ns_capable(old->user_ns, CAP_SETUID)) {
595595 if (ruid != (uid_t) -1 && !uid_eq(kruid, old->uid) &&
596596 !uid_eq(kruid, old->euid) && !uid_eq(kruid, old->suid))
597597 goto error;
@@ -673,7 +673,7 @@ SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid) · 75 unmodified lines
673673 old = current_cred();
674674
675675 retval = -EPERM;
676− if (!nsown_capable(CAP_SETGID)) {
676+ if (!ns_capable(old->user_ns, CAP_SETGID)) {
677677 if (rgid != (gid_t) -1 && !gid_eq(krgid, old->gid) &&
678678 !gid_eq(krgid, old->egid) && !gid_eq(krgid, old->sgid))
679679 goto error;
@@ -744,7 +744,7 @@ SYSCALL_DEFINE1(setfsuid, uid_t, uid) · 64 unmodified lines
744744
745745 if (uid_eq(kuid, old->uid) || uid_eq(kuid, old->euid) ||
746746 uid_eq(kuid, old->suid) || uid_eq(kuid, old->fsuid) ||
747− nsown_capable(CAP_SETUID)) {
747+ ns_capable(old->user_ns, CAP_SETUID)) {
748748 if (!uid_eq(kuid, old->fsuid)) {
749749 new->fsuid = kuid;
750750 if (security_task_fix_setuid(new, old, LSM_SETID_FS) == 0)
@@ -783,7 +783,7 @@ SYSCALL_DEFINE1(setfsgid, gid_t, gid) · 32 unmodified lines
783783
784784 if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->egid) ||
785785 gid_eq(kgid, old->sgid) || gid_eq(kgid, old->fsgid) ||
786− nsown_capable(CAP_SETGID)) {
786+ ns_capable(old->user_ns, CAP_SETGID)) {
787787 if (!gid_eq(kgid, old->fsgid)) {
788788 new->fsgid = kgid;
789789 goto change_okay;
kernel/uid16.c+1−1
@@ -176,7 +176,7 @@ SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist) · 175 unmodified lines
176176 struct group_info *group_info;
177177 int retval;
178178
179− if (!nsown_capable(CAP_SETGID))
179+ if (!ns_capable(current_user_ns(), CAP_SETGID))
180180 return -EPERM;
181181 if ((unsigned)gidsetsize > NGROUPS_MAX)
182182 return -EINVAL;
kernel/utsname.c+1−1
@@ -114,7 +114,7 @@ static int utsns_install(struct nsproxy *nsproxy, void *new) · 113 unmodified lines
114114 struct uts_namespace *ns = new;
115115
116116 if (!ns_capable(ns->user_ns, CAP_SYS_ADMIN) ||
117− !nsown_capable(CAP_SYS_ADMIN))
117+ !ns_capable(current_user_ns(), CAP_SYS_ADMIN))
118118 return -EPERM;
119119
120120 get_uts_ns(ns);
net/core/net_namespace.c+1−1
@@ -651,7 +651,7 @@ static int netns_install(struct nsproxy *nsproxy, void *ns) · 650 unmodified lines
651651 struct net *net = ns;
652652
653653 if (!ns_capable(net->user_ns, CAP_SYS_ADMIN) ||
654− !nsown_capable(CAP_SYS_ADMIN))
654+ !ns_capable(current_user_ns(), CAP_SYS_ADMIN))
655655 return -EPERM;
656656
657657 put_net(nsproxy->net_ns);
net/core/scm.c+2−2
@@ -56,9 +56,9 @@ static __inline__ int scm_check_creds(struct ucred *creds) · 55 unmodified lines
5656 if ((creds->pid == task_tgid_vnr(current) ||
5757 ns_capable(current->nsproxy->pid_ns->user_ns, CAP_SYS_ADMIN)) &&
5858 ((uid_eq(uid, cred->uid) || uid_eq(uid, cred->euid) ||
59− uid_eq(uid, cred->suid)) || nsown_capable(CAP_SETUID)) &&
59+ uid_eq(uid, cred->suid)) || ns_capable(cred->user_ns, CAP_SETUID)) &&
6060 ((gid_eq(gid, cred->gid) || gid_eq(gid, cred->egid) ||
61− gid_eq(gid, cred->sgid)) || nsown_capable(CAP_SETGID))) {
61+ gid_eq(gid, cred->sgid)) || ns_capable(cred->user_ns, CAP_SETGID))) {
6262 return 0;
6363 }
6464 return -EPERM;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t