blob: a8521a14e4af8680b8afd2c46defc59a4ecb6a00 [file] [log] [blame]
From 0010c971e218d68596d66bf4588ff9a7fa519bcb Mon Sep 17 00:00:00 2001
From: Daniel Rosenberg <drosen@google.com>
Date: Thu, 15 Mar 2018 20:58:32 -0700
Subject: [PATCH] CHROMIUM: configfs: inherit file and directory owners
All entries in configfs are currently owned by root,
regardless of context. Instead, this preserves the
current ownership, allowing userspace to choose who
has permissions to configure the system through
any particular configfs subsystem.
This means anyone who can create a group will now
have the ability to create any groups inside of that
group.
Conflicts:
CURRENT_TIME is no longer defined, reworked
to use specified time granularity.
BUG=b:63876697
TEST=compilation, mkdir under configfs after chowning
Change-Id: I11087cdd58ff1560de72c9452f1ba13881f10cf6
Signed-off-by: Daniel Rosenberg <drosen@google.com>
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/965762
Tested-by: Gwendal Grignou <gwendal@google.com>
(cherry picked from commit fa9d2f446d10940f6e6bef4cd8c6d027e95cd0c4)
Reviewed-on: https://chromium-review.googlesource.com/1102012
Commit-Ready: Sarthak Kukreti <sarthakkukreti@chromium.org>
Tested-by: Sarthak Kukreti <sarthakkukreti@chromium.org>
[rebase419(groeck): timebase -> timebase64 changes]
Signed-off-by: Guenter Roeck <groeck@chromium.org>
[rebase54(groeck):
Replace current_kernel_time64() with new API
configfs_create() returns an ERR_PTR on error
]
Signed-off-by: Guenter Roeck <groeck@chromium.org>
[rebase510(groeck):
fs/configfs/inode.c: timespec64_trunc() no longer exists
]
Signed-off-by: Guenter Roeck <groeck@chromium.org>
Change-Id: Ie486fdbda75565284203adc5dfc2d4ccc890ebdd
---
fs/configfs/inode.c | 39 ++++++++++++++++++++++++++++++++-------
1 file changed, 32 insertions(+), 7 deletions(-)
diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c
index 1c15edbe70ff7395ebd464452f823c7ca60dfec6..3ffa0bbdbfb28a8a71a04ef2cf7903afa6d30b84 100644
--- a/fs/configfs/inode.c
+++ b/fs/configfs/inode.c
@@ -32,6 +32,28 @@ static const struct inode_operations configfs_inode_operations ={
.setattr = configfs_setattr,
};
+static struct iattr *configfs_alloc_iattr(struct configfs_dirent *sd_parent,
+ struct configfs_dirent *sd, unsigned int s_time_gran)
+{
+ struct iattr *sd_iattr;
+
+ sd_iattr = kzalloc(sizeof(struct iattr), GFP_KERNEL);
+ if (!sd_iattr)
+ return NULL;
+ /* assign default attributes */
+ sd_iattr->ia_mode = sd->s_mode;
+ if (sd_parent && sd_parent->s_iattr) {
+ sd_iattr->ia_uid = sd_parent->s_iattr->ia_uid;
+ sd_iattr->ia_gid = sd_parent->s_iattr->ia_gid;
+ } else {
+ sd_iattr->ia_uid = GLOBAL_ROOT_UID;
+ sd_iattr->ia_gid = GLOBAL_ROOT_GID;
+ }
+ ktime_get_coarse_real_ts64(&sd_iattr->ia_ctime);
+ sd_iattr->ia_atime = sd_iattr->ia_mtime = sd_iattr->ia_ctime;
+ return sd_iattr;
+}
+
int configfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
struct iattr *iattr)
{
@@ -47,15 +69,9 @@ int configfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
sd_iattr = sd->s_iattr;
if (!sd_iattr) {
/* setting attributes for the first time, allocate now */
- sd_iattr = kzalloc(sizeof(struct iattr), GFP_KERNEL);
+ sd_iattr = configfs_alloc_iattr(NULL, sd, inode->i_sb->s_time_gran);
if (!sd_iattr)
return -ENOMEM;
- /* assign default attributes */
- sd_iattr->ia_mode = sd->s_mode;
- sd_iattr->ia_uid = GLOBAL_ROOT_UID;
- sd_iattr->ia_gid = GLOBAL_ROOT_GID;
- sd_iattr->ia_atime = sd_iattr->ia_mtime =
- sd_iattr->ia_ctime = current_time(inode);
sd->s_iattr = sd_iattr;
}
/* attributes were changed atleast once in past */
@@ -159,6 +175,7 @@ struct inode *configfs_create(struct dentry *dentry, umode_t mode)
struct inode *inode = NULL;
struct configfs_dirent *sd;
struct inode *p_inode;
+ struct dentry *parent;
if (!dentry)
return ERR_PTR(-ENOENT);
@@ -167,6 +184,14 @@ struct inode *configfs_create(struct dentry *dentry, umode_t mode)
return ERR_PTR(-EEXIST);
sd = dentry->d_fsdata;
+ parent = dget_parent(dentry);
+ if (parent && !sd->s_iattr) {
+ sd->s_iattr = configfs_alloc_iattr(parent->d_fsdata, sd,
+ parent->d_sb->s_time_gran);
+ if (!sd->s_iattr)
+ return ERR_PTR(-ENOMEM);
+ }
+ dput(parent);
inode = configfs_new_inode(mode, sd, dentry->d_sb);
if (!inode)
return ERR_PTR(-ENOMEM);
--
2.38.3