mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
Revert "Revert "FROMLIST: overlayfs: internal getxattr operations without sepolicy checking""
This reverts commitd987f90515which was reverting4aa24aec05. 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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user