Revert "Revert "FROMLIST: overlayfs: internal getxattr operations without sepolicy checking""

This reverts commit d987f90515 which was
reverting 4aa24aec05.

All should be good now.

Cc: Mark Salyzyn <salyzyn@android.com>
Cc: kernel-team@android.com
Cc: Mark Salyzyn <salyzyn@google.com>
Bug: 133515582
Bug: 136124883
Bug: 129319403
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: Ic764d90114d41daf6defdbfbc4db43a8c224e6dc
This commit is contained in:
Greg Kroah-Hartman
2020-02-08 14:23:00 +01:00
parent 9406c91e36
commit 791d8a9831
3 changed files with 23 additions and 14 deletions

View File

@@ -106,10 +106,11 @@ int ovl_check_fb_len(struct ovl_fb *fb, int fb_len)
static struct ovl_fh *ovl_get_fh(struct dentry *dentry, const char *name)
{
int res, err;
ssize_t res;
int err;
struct ovl_fh *fh = NULL;
res = vfs_getxattr(dentry, name, NULL, 0);
res = ovl_do_vfs_getxattr(dentry, name, NULL, 0);
if (res < 0) {
if (res == -ENODATA || res == -EOPNOTSUPP)
return NULL;
@@ -123,7 +124,7 @@ static struct ovl_fh *ovl_get_fh(struct dentry *dentry, const char *name)
if (!fh)
return ERR_PTR(-ENOMEM);
res = vfs_getxattr(dentry, name, fh->buf, res);
res = ovl_do_vfs_getxattr(dentry, name, fh->buf, res);
if (res < 0)
goto fail;
@@ -141,10 +142,10 @@ out:
return NULL;
fail:
pr_warn_ratelimited("failed to get origin (%i)\n", res);
pr_warn_ratelimited("failed to get origin (%zi)\n", res);
goto out;
invalid:
pr_warn_ratelimited("invalid origin (%*phN)\n", res, fh);
pr_warn_ratelimited("invalid origin (%*phN)\n", (int)res, fh);
goto out;
}

View File

@@ -219,6 +219,14 @@ static inline bool ovl_open_flags_need_copy_up(int flags)
return ((OPEN_FMODE(flags) & FMODE_WRITE) || (flags & O_TRUNC));
}
static inline ssize_t ovl_do_vfs_getxattr(struct dentry *dentry,
const char *name, void *buf,
size_t size)
{
return __vfs_getxattr(dentry, d_inode(dentry), name, buf, size,
XATTR_NOSECURITY);
}
/* util.c */
int ovl_want_write(struct dentry *dentry);
void ovl_drop_write(struct dentry *dentry);

View File

@@ -525,9 +525,9 @@ void ovl_copy_up_end(struct dentry *dentry)
bool ovl_check_origin_xattr(struct dentry *dentry)
{
int res;
ssize_t res;
res = vfs_getxattr(dentry, OVL_XATTR_ORIGIN, NULL, 0);
res = ovl_do_vfs_getxattr(dentry, OVL_XATTR_ORIGIN, NULL, 0);
/* Zero size value means "copied up but origin unknown" */
if (res >= 0)
@@ -538,13 +538,13 @@ bool ovl_check_origin_xattr(struct dentry *dentry)
bool ovl_check_dir_xattr(struct dentry *dentry, const char *name)
{
int res;
ssize_t res;
char val;
if (!d_is_dir(dentry))
return false;
res = vfs_getxattr(dentry, name, &val, 1);
res = ovl_do_vfs_getxattr(dentry, name, &val, 1);
if (res == 1 && val == 'y')
return true;
@@ -825,13 +825,13 @@ err:
/* err < 0, 0 if no metacopy xattr, 1 if metacopy xattr found */
int ovl_check_metacopy_xattr(struct dentry *dentry)
{
int res;
ssize_t res;
/* Only regular files can have metacopy xattr */
if (!S_ISREG(d_inode(dentry)->i_mode))
return 0;
res = vfs_getxattr(dentry, OVL_XATTR_METACOPY, NULL, 0);
res = ovl_do_vfs_getxattr(dentry, OVL_XATTR_METACOPY, NULL, 0);
if (res < 0) {
if (res == -ENODATA || res == -EOPNOTSUPP)
return 0;
@@ -840,7 +840,7 @@ int ovl_check_metacopy_xattr(struct dentry *dentry)
return 1;
out:
pr_warn_ratelimited("failed to get metacopy (%i)\n", res);
pr_warn_ratelimited("failed to get metacopy (%zi)\n", res);
return res;
}
@@ -866,7 +866,7 @@ ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value,
ssize_t res;
char *buf = NULL;
res = vfs_getxattr(dentry, name, NULL, 0);
res = ovl_do_vfs_getxattr(dentry, name, NULL, 0);
if (res < 0) {
if (res == -ENODATA || res == -EOPNOTSUPP)
return -ENODATA;
@@ -878,7 +878,7 @@ ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value,
if (!buf)
return -ENOMEM;
res = vfs_getxattr(dentry, name, buf, res);
res = ovl_do_vfs_getxattr(dentry, name, buf, res);
if (res < 0)
goto fail;
}