Commit 65d51ade authored by Seth Forshee's avatar Seth Forshee Committed by Luis Henriques

(namespace) Revert "UBUNTU: SAUCE: fs: Allow superblock owner to change...

(namespace) Revert "UBUNTU: SAUCE: fs: Allow superblock owner to change ownership of inodes with unmappable ids"

This reverts commit 6e42b32e in
order to apply the version in yakkety.
Signed-off-by: default avatarSeth Forshee <seth.forshee@canonical.com>
Acked-by: default avatarTim Gardner <tim.gardner@canonical.com>
Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
parent 038b77f6
...@@ -16,43 +16,6 @@ ...@@ -16,43 +16,6 @@
#include <linux/evm.h> #include <linux/evm.h>
#include <linux/ima.h> #include <linux/ima.h>
static bool chown_ok(const struct inode *inode, kuid_t uid)
{
struct user_namespace *user_ns;
if (uid_eq(current_fsuid(), inode->i_uid) && uid_eq(uid, inode->i_uid))
return true;
if (capable_wrt_inode_uidgid(inode, CAP_CHOWN))
return true;
user_ns = inode->i_sb->s_user_ns;
if (!uid_valid(inode->i_uid) &&
(!gid_valid(inode->i_gid) || kgid_has_mapping(user_ns, inode->i_gid)) &&
ns_capable(user_ns, CAP_CHOWN))
return true;
return false;
}
static bool chgrp_ok(const struct inode *inode, kgid_t gid)
{
struct user_namespace *user_ns;
if (uid_eq(current_fsuid(), inode->i_uid) &&
(in_group_p(gid) || gid_eq(gid, inode->i_gid)))
return true;
if (capable_wrt_inode_uidgid(inode, CAP_CHOWN))
return true;
user_ns = inode->i_sb->s_user_ns;
if (!gid_valid(inode->i_gid) &&
(!uid_valid(inode->i_uid) || kuid_has_mapping(user_ns, inode->i_uid)) &&
ns_capable(user_ns, CAP_CHOWN))
return true;
return false;
}
/** /**
* inode_change_ok - check if attribute changes to an inode are allowed * inode_change_ok - check if attribute changes to an inode are allowed
* @inode: inode to check * @inode: inode to check
...@@ -84,11 +47,17 @@ int inode_change_ok(const struct inode *inode, struct iattr *attr) ...@@ -84,11 +47,17 @@ int inode_change_ok(const struct inode *inode, struct iattr *attr)
return 0; return 0;
/* Make sure a caller can chown. */ /* Make sure a caller can chown. */
if ((ia_valid & ATTR_UID) && !chown_ok(inode, attr->ia_uid)) if ((ia_valid & ATTR_UID) &&
(!uid_eq(current_fsuid(), inode->i_uid) ||
!uid_eq(attr->ia_uid, inode->i_uid)) &&
!capable_wrt_inode_uidgid(inode, CAP_CHOWN))
return -EPERM; return -EPERM;
/* Make sure caller can chgrp. */ /* Make sure caller can chgrp. */
if ((ia_valid & ATTR_GID) && !chgrp_ok(inode, attr->ia_gid)) if ((ia_valid & ATTR_GID) &&
(!uid_eq(current_fsuid(), inode->i_uid) ||
(!in_group_p(attr->ia_gid) && !gid_eq(attr->ia_gid, inode->i_gid))) &&
!capable_wrt_inode_uidgid(inode, CAP_CHOWN))
return -EPERM; return -EPERM;
/* Make sure a caller can chmod. */ /* Make sure a caller can chmod. */
......
...@@ -117,8 +117,6 @@ int kernfs_iop_setattr(struct dentry *dentry, struct iattr *iattr) ...@@ -117,8 +117,6 @@ int kernfs_iop_setattr(struct dentry *dentry, struct iattr *iattr)
if (!kn) if (!kn)
return -EINVAL; return -EINVAL;
if (!uid_valid(inode->i_uid) || !gid_valid(inode->i_gid))
return -EPERM;
mutex_lock(&kernfs_mutex); mutex_lock(&kernfs_mutex);
error = inode_change_ok(inode, iattr); error = inode_change_ok(inode, iattr);
......
...@@ -711,8 +711,6 @@ int proc_setattr(struct dentry *dentry, struct iattr *attr) ...@@ -711,8 +711,6 @@ int proc_setattr(struct dentry *dentry, struct iattr *attr)
if (attr->ia_valid & ATTR_MODE) if (attr->ia_valid & ATTR_MODE)
return -EPERM; return -EPERM;
if (!uid_valid(inode->i_uid) || !gid_valid(inode->i_gid))
return -EPERM;
error = inode_change_ok(inode, attr); error = inode_change_ok(inode, attr);
if (error) if (error)
......
...@@ -105,9 +105,6 @@ static int proc_notify_change(struct dentry *dentry, struct iattr *iattr) ...@@ -105,9 +105,6 @@ static int proc_notify_change(struct dentry *dentry, struct iattr *iattr)
struct proc_dir_entry *de = PDE(inode); struct proc_dir_entry *de = PDE(inode);
int error; int error;
if (!uid_valid(inode->i_uid) || !gid_valid(inode->i_gid))
return -EPERM;
error = inode_change_ok(inode, iattr); error = inode_change_ok(inode, iattr);
if (error) if (error)
return error; return error;
......
...@@ -752,8 +752,6 @@ static int proc_sys_setattr(struct dentry *dentry, struct iattr *attr) ...@@ -752,8 +752,6 @@ static int proc_sys_setattr(struct dentry *dentry, struct iattr *attr)
if (attr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID)) if (attr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID))
return -EPERM; return -EPERM;
if (!uid_valid(inode->i_uid) || !gid_valid(inode->i_gid))
return -EPERM;
error = inode_change_ok(inode, attr); error = inode_change_ok(inode, attr);
if (error) if (error)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment