On Mon, Mar 22, 2021 at 2:18 PM Dan Carpenter <dan.carpenter@xxxxxxxxxx> wrote: > > Hello Amir Goldstein, > > The patch aa3ff3c152ff: "ovl: copy up of disconnected dentries" from > Oct 15, 2017, leads to the following static checker warning: Heh! that's fashionably late :) > > fs/overlayfs/copy_up.c:972 ovl_copy_up_flags() > warn: 'old_cred' not released on lines: 944. > > fs/overlayfs/copy_up.c > 932 static int ovl_copy_up_flags(struct dentry *dentry, int flags) > 933 { > 934 int err = 0; > 935 const struct cred *old_cred = ovl_override_creds(dentry->d_sb); > 936 bool disconnected = (dentry->d_flags & DCACHE_DISCONNECTED); > 937 > 938 /* > 939 * With NFS export, copy up can get called for a disconnected non-dir. > 940 * In this case, we will copy up lower inode to index dir without > 941 * linking it to upper dir. > 942 */ > 943 if (WARN_ON(disconnected && d_is_dir(dentry))) > 944 return -EIO; > > Should this call revert_creds(old_cred); before returning? Yes. Here's a simple fix, care to post it? Thanks, Amir. diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index 0b2891c6c71e..2846b943e80c 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -932,7 +932,7 @@ static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, static int ovl_copy_up_flags(struct dentry *dentry, int flags) { int err = 0; - const struct cred *old_cred = ovl_override_creds(dentry->d_sb); + const struct cred *old_cred; bool disconnected = (dentry->d_flags & DCACHE_DISCONNECTED); /* @@ -943,6 +943,7 @@ static int ovl_copy_up_flags(struct dentry *dentry, int flags) if (WARN_ON(disconnected && d_is_dir(dentry))) return -EIO; + old_cred = ovl_override_creds(dentry->d_sb); while (!err) { struct dentry *next; struct dentry *parent = NULL;