diff options
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/net-sysfs.c | 8 | ||||
-rw-r--r-- | net/core/net_namespace.c | 2 | ||||
-rw-r--r-- | net/core/scm.c | 4 |
3 files changed, 11 insertions, 3 deletions
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 3f40ea9de814..d954b56b4e47 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
@@ -1196,6 +1196,13 @@ static void remove_queue_kobjects(struct net_device *net) | |||
1196 | #endif | 1196 | #endif |
1197 | } | 1197 | } |
1198 | 1198 | ||
1199 | static bool net_current_may_mount(void) | ||
1200 | { | ||
1201 | struct net *net = current->nsproxy->net_ns; | ||
1202 | |||
1203 | return ns_capable(net->user_ns, CAP_SYS_ADMIN); | ||
1204 | } | ||
1205 | |||
1199 | static void *net_grab_current_ns(void) | 1206 | static void *net_grab_current_ns(void) |
1200 | { | 1207 | { |
1201 | struct net *ns = current->nsproxy->net_ns; | 1208 | struct net *ns = current->nsproxy->net_ns; |
@@ -1218,6 +1225,7 @@ static const void *net_netlink_ns(struct sock *sk) | |||
1218 | 1225 | ||
1219 | struct kobj_ns_type_operations net_ns_type_operations = { | 1226 | struct kobj_ns_type_operations net_ns_type_operations = { |
1220 | .type = KOBJ_NS_TYPE_NET, | 1227 | .type = KOBJ_NS_TYPE_NET, |
1228 | .current_may_mount = net_current_may_mount, | ||
1221 | .grab_current_ns = net_grab_current_ns, | 1229 | .grab_current_ns = net_grab_current_ns, |
1222 | .netlink_ns = net_netlink_ns, | 1230 | .netlink_ns = net_netlink_ns, |
1223 | .initial_ns = net_initial_ns, | 1231 | .initial_ns = net_initial_ns, |
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index f97652036754..81d3a9a08453 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
@@ -651,7 +651,7 @@ static int netns_install(struct nsproxy *nsproxy, void *ns) | |||
651 | struct net *net = ns; | 651 | struct net *net = ns; |
652 | 652 | ||
653 | if (!ns_capable(net->user_ns, CAP_SYS_ADMIN) || | 653 | if (!ns_capable(net->user_ns, CAP_SYS_ADMIN) || |
654 | !nsown_capable(CAP_SYS_ADMIN)) | 654 | !ns_capable(current_user_ns(), CAP_SYS_ADMIN)) |
655 | return -EPERM; | 655 | return -EPERM; |
656 | 656 | ||
657 | put_net(nsproxy->net_ns); | 657 | put_net(nsproxy->net_ns); |
diff --git a/net/core/scm.c b/net/core/scm.c index b4da80b1cc07..b442e7e25e60 100644 --- a/net/core/scm.c +++ b/net/core/scm.c | |||
@@ -56,9 +56,9 @@ static __inline__ int scm_check_creds(struct ucred *creds) | |||
56 | if ((creds->pid == task_tgid_vnr(current) || | 56 | if ((creds->pid == task_tgid_vnr(current) || |
57 | ns_capable(task_active_pid_ns(current)->user_ns, CAP_SYS_ADMIN)) && | 57 | ns_capable(task_active_pid_ns(current)->user_ns, CAP_SYS_ADMIN)) && |
58 | ((uid_eq(uid, cred->uid) || uid_eq(uid, cred->euid) || | 58 | ((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)) && |
60 | ((gid_eq(gid, cred->gid) || gid_eq(gid, cred->egid) || | 60 | ((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))) { |
62 | return 0; | 62 | return 0; |
63 | } | 63 | } |
64 | return -EPERM; | 64 | return -EPERM; |