From: Sasha Levin (Microsoft) Date: Thu, 18 Apr 2019 14:19:21 +0000 (-0400) Subject: patches for 4.4 X-Git-Tag: v4.9.170~15 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fkernel%2Fstable-queue.git;a=commitdiff_plain;h=3f675dd806defefc6970a9a37cdb2ca5f54aa1df patches for 4.4 Signed-off-by: Sasha Levin (Microsoft) --- diff --git a/queue-4.4/ovl-fix-uid-gid-when-creating-over-whiteout.patch b/queue-4.4/ovl-fix-uid-gid-when-creating-over-whiteout.patch new file mode 100644 index 0000000000..1fd14f8c2d --- /dev/null +++ b/queue-4.4/ovl-fix-uid-gid-when-creating-over-whiteout.patch @@ -0,0 +1,60 @@ +From 16c06d419ec62adc29be4a053c6a62eeeb4f6ca7 Mon Sep 17 00:00:00 2001 +From: Miklos Szeredi +Date: Wed, 15 Jun 2016 14:18:59 +0200 +Subject: ovl: fix uid/gid when creating over whiteout + +[ Upstream commit d0e13f5bbe4be7c8f27736fc40503dcec04b7de0 ] + +Fix a regression when creating a file over a whiteout. The new +file/directory needs to use the current fsuid/fsgid, not the ones from the +mounter's credentials. + +The refcounting is a bit tricky: prepare_creds() sets an original refcount, +override_creds() gets one more, which revert_cred() drops. So + + 1) we need to expicitly put the mounter's credentials when overriding + with the updated one + + 2) we need to put the original ref to the updated creds (and this can + safely be done before revert_creds(), since we'll still have the ref + from override_creds()). + +Reported-by: Stephen Smalley +Fixes: 3fe6e52f0626 ("ovl: override creds with the ones from the superblock mounter") +Signed-off-by: Miklos Szeredi +Signed-off-by: Sasha Levin (Microsoft) +--- + fs/overlayfs/dir.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c +index f8aa54272121..eedacae889b9 100644 +--- a/fs/overlayfs/dir.c ++++ b/fs/overlayfs/dir.c +@@ -408,12 +408,21 @@ static int ovl_create_or_link(struct dentry *dentry, int mode, dev_t rdev, + err = ovl_create_upper(dentry, inode, &stat, link, hardlink); + } else { + const struct cred *old_cred; ++ struct cred *override_cred; + + old_cred = ovl_override_creds(dentry->d_sb); + +- err = ovl_create_over_whiteout(dentry, inode, &stat, link, +- hardlink); ++ err = -ENOMEM; ++ override_cred = prepare_creds(); ++ if (override_cred) { ++ override_cred->fsuid = old_cred->fsuid; ++ override_cred->fsgid = old_cred->fsgid; ++ put_cred(override_creds(override_cred)); ++ put_cred(override_cred); + ++ err = ovl_create_over_whiteout(dentry, inode, &stat, ++ link, hardlink); ++ } + revert_creds(old_cred); + } + +-- +2.19.1 + diff --git a/queue-4.4/series b/queue-4.4/series index c6ad6e8c9d..05902693ef 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -132,3 +132,4 @@ appletalk-fix-use-after-free-in-atalk_proc_exit.patch lib-div64.c-off-by-one-in-shift.patch include-linux-swap.h-use-offsetof-instead-of-custom-.patch tpm-tpm_crb-avoid-unaligned-reads-in-crb_recv.patch +ovl-fix-uid-gid-when-creating-over-whiteout.patch