From d987f9051569578e851d2fc164420260d39504d2 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sat, 8 Feb 2020 14:03:52 +0100 Subject: [PATCH] Revert "FROMLIST: overlayfs: internal getxattr operations without sepolicy checking" This reverts commit 4aa24aec05e506016655d78a073625214ab27398 as it was not upstream and causes problems with the overlayfs upstream merge point. It needs to be added back "soon". Cc: Mark Salyzyn Cc: kernel-team@android.com Cc: Mark Salyzyn Bug: 133515582 Bug: 136124883 Bug: 129319403 Signed-off-by: Greg Kroah-Hartman Change-Id: Ic429c8b13181fbaaf7e060b463e86bb9a06ad66e --- fs/overlayfs/namei.c | 12 +++++------- fs/overlayfs/overlayfs.h | 8 -------- fs/overlayfs/util.c | 18 +++++++++--------- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c index 823bca62b58d..76ff66339173 100644 --- a/fs/overlayfs/namei.c +++ b/fs/overlayfs/namei.c @@ -106,11 +106,10 @@ 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) { - ssize_t res; - int err; + int res, err; struct ovl_fh *fh = NULL; - res = ovl_do_vfs_getxattr(dentry, name, NULL, 0); + res = vfs_getxattr(dentry, name, NULL, 0); if (res < 0) { if (res == -ENODATA || res == -EOPNOTSUPP) return NULL; @@ -124,7 +123,7 @@ static struct ovl_fh *ovl_get_fh(struct dentry *dentry, const char *name) if (!fh) return ERR_PTR(-ENOMEM); - res = ovl_do_vfs_getxattr(dentry, name, fh->buf, res); + res = vfs_getxattr(dentry, name, fh->buf, res); if (res < 0) goto fail; @@ -142,11 +141,10 @@ out: return NULL; fail: - pr_warn_ratelimited("overlayfs: failed to get origin (%zi)\n", res); + pr_warn_ratelimited("overlayfs: failed to get origin (%i)\n", res); goto out; invalid: - pr_warn_ratelimited("overlayfs: invalid origin (%*phN)\n", - (int)res, fh); + pr_warn_ratelimited("overlayfs: invalid origin (%*phN)\n", res, fh); goto out; } diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index d6f02b4bed74..fcf80548bb65 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -216,14 +216,6 @@ 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); diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 2050c5084a82..f5678a3f8350 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -537,9 +537,9 @@ void ovl_copy_up_end(struct dentry *dentry) bool ovl_check_origin_xattr(struct dentry *dentry) { - ssize_t res; + int res; - res = ovl_do_vfs_getxattr(dentry, OVL_XATTR_ORIGIN, NULL, 0); + res = vfs_getxattr(dentry, OVL_XATTR_ORIGIN, NULL, 0); /* Zero size value means "copied up but origin unknown" */ if (res >= 0) @@ -550,13 +550,13 @@ bool ovl_check_origin_xattr(struct dentry *dentry) bool ovl_check_dir_xattr(struct dentry *dentry, const char *name) { - ssize_t res; + int res; char val; if (!d_is_dir(dentry)) return false; - res = ovl_do_vfs_getxattr(dentry, name, &val, 1); + res = vfs_getxattr(dentry, name, &val, 1); if (res == 1 && val == 'y') return true; @@ -837,13 +837,13 @@ err: /* err < 0, 0 if no metacopy xattr, 1 if metacopy xattr found */ int ovl_check_metacopy_xattr(struct dentry *dentry) { - ssize_t res; + int res; /* Only regular files can have metacopy xattr */ if (!S_ISREG(d_inode(dentry)->i_mode)) return 0; - res = ovl_do_vfs_getxattr(dentry, OVL_XATTR_METACOPY, NULL, 0); + res = vfs_getxattr(dentry, OVL_XATTR_METACOPY, NULL, 0); if (res < 0) { if (res == -ENODATA || res == -EOPNOTSUPP) return 0; @@ -852,7 +852,7 @@ int ovl_check_metacopy_xattr(struct dentry *dentry) return 1; out: - pr_warn_ratelimited("overlayfs: failed to get metacopy (%zi)\n", res); + pr_warn_ratelimited("overlayfs: failed to get metacopy (%i)\n", res); return res; } @@ -878,7 +878,7 @@ ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value, ssize_t res; char *buf = NULL; - res = ovl_do_vfs_getxattr(dentry, name, NULL, 0); + res = vfs_getxattr(dentry, name, NULL, 0); if (res < 0) { if (res == -ENODATA || res == -EOPNOTSUPP) return -ENODATA; @@ -890,7 +890,7 @@ ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value, if (!buf) return -ENOMEM; - res = ovl_do_vfs_getxattr(dentry, name, buf, res); + res = vfs_getxattr(dentry, name, buf, res); if (res < 0) goto fail; }