Patch "ovl: verify upper dentry in ovl_remove_and_whiteout()" has been added to the 4.6-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ovl: verify upper dentry in ovl_remove_and_whiteout()
to the 4.6-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ovl-verify-upper-dentry-in-ovl_remove_and_whiteout.patch
and it can be found in the queue-4.6 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
cfc9fde0b07c3b44b570057c5f93dda59dca1c94Mon Sep 17 00:00:00 2001
From: Maxim Patlasov <[email protected]>
Date: Thu, 21 Jul 2016 18:24:26 -0700
Subject: ovl: verify upper dentry in ovl_remove_and_whiteout()
From: Maxim Patlasov <[email protected]>
commit cfc9fde0b07c3b44b570057c5f93dda59dca1c94 upstream.
The upper dentry may become stale before we call ovl_lock_rename_workdir. For example, someone could (mistakenly or maliciously) manually unlink(2) it directly from upperdir.
To ensure it is not stale, let's lookup it after ovl_lock_rename_workdir and and check if it matches the upper dentry.
Essentially, it is the same problem and similar solution as in commit 11f3710417d0 ("ovl: verify upper dentry before unlink and rename").
--- fs/overlayfs/dir.c | 56 +++++++++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 31 deletions(-)
fs/overlayfs/dir.c +25 -31
@@ -511,6 +511,7 @@ static int ovl_remove_and_whiteout(strucstruct dentry *upper;struct dentry *opaquedir =NULL ;int err; +int flags =0 ;if (WARN_ON (!workdir))return -EROFS ;
@@ -540,46 +541,39 @@ static int ovl_remove_and_whiteout(strucif (err) goto out_dput; + upper =lookup_one_len (dentry->d_name.name, upperdir, + dentry->d_name.len); + err =PTR_ERR (upper); +if (IS_ERR (upper)) + goto out_unlock; + + err = -ESTALE ; +if ((opaquedir && upper != opaquedir) || + (!opaquedir &&ovl_dentry_upper (dentry) && + upper !=ovl_dentry_upper (dentry))) { + goto out_dput_upper; + } + whiteout =ovl_whiteout (workdir, dentry); err =PTR_ERR (whiteout);if (IS_ERR (whiteout)) - goto out_unlock; + goto out_dput_upper; - upper =ovl_dentry_upper (dentry); -if (!upper) { - upper =lookup_one_len (dentry->d_name.name, upperdir, - dentry->d_name.len); - err =PTR_ERR (upper); -if (IS_ERR (upper)) - goto kill_whiteout; - - err =ovl_do_rename (wdir, whiteout, udir, upper,0 ); -dput (upper); -if (err) - goto kill_whiteout; - }else { -int flags =0 ; - -if (opaquedir) - upper = opaquedir; - err = -ESTALE ; -if (upper->d_parent != upperdir) - goto kill_whiteout; - -if (is_dir) - flags |=RENAME_EXCHANGE ; - - err =ovl_do_rename (wdir, whiteout, udir, upper, flags); -if (err) - goto kill_whiteout; +if (d_is_dir (upper)) + flags =RENAME_EXCHANGE ; + + err =ovl_do_rename (wdir, whiteout, udir, upper, flags); +if (err) + goto kill_whiteout; +if (flags) +ovl_cleanup (wdir, upper); -if (is_dir) -ovl_cleanup (wdir, upper); - }ovl_dentry_version_inc (dentry->d_parent); out_d_drop:d_drop (dentry);dput (whiteout); +out_dput_upper: +dput (upper); out_unlock:unlock_rename (workdir, upperdir); out_dput:
Patches currently in stable-queue which might be from [email protected] are
queue-4.6/ovl-verify-upper-dentry-in-ovl_remove_and_whiteout.patch