Patch "vfs: move permission checking into notify_change() for utimes(NULL)" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
vfs: move permission checking into notify_change() for utimes(NULL)
to the 4.4-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:
vfs-move-permission-checking-into-notify_change-for-utimes-null.patch
and it can be found in the queue-4.4 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
f2b20f6ee842313a0d681dbbf7f87b70291a6a3bMon Sep 17 00:00:00 2001
From: Miklos Szeredi <[email protected]>
Date: Fri, 16 Sep 2016 12:44:20 +0200
Subject: vfs: move permission checking into notify_change() for utimes(NULL)
From: Miklos Szeredi <[email protected]>
commit f2b20f6ee842313a0d681dbbf7f87b70291a6a3b upstream.
This fixes a bug where the permission was not properly checked in overlayfs. The testcase is ltp/utimensat01.
It is also cleaner and safer to do the permission checking in the vfs helper instead of the caller.
This patch introduces an additional ia_valid flag ATTR_TOUCH (since touch(1) is the most obvious user of utimes(NULL)) that is passed into notify_change whenever the conditions for this special permission checking mode are met.
--- fs/attr.c | 15 +++++++++++++++ fs/utimes.c | 16 +--------------- include/linux/fs.h | 1 + 3 files changed, 17 insertions(+), 15 deletions(-)
fs/attr.c +15 -0
@@ -202,6 +202,21 @@ int notify_change(struct dentry * dentryreturn -EPERM ; } +/* +* If utimes(2) and friends are called with times == NULL (or both +* times are UTIME_NOW), then we need to check for write permission +*/ +if (ia_valid &ATTR_TOUCH ) { +if (IS_IMMUTABLE (inode)) +return -EPERM ; + +if (!inode_owner_or_capable (inode)) { + error =inode_permission (inode,MAY_WRITE ); +if (error) +return error; + } + } +if ((ia_valid &ATTR_MODE )) {umode_t amode = attr->ia_mode;/* Flag setting protected by i_mutex */
fs/utimes.c +1 -15
@@ -87,20 +87,7 @@ static int utimes_common(struct path *pa*/ newattrs.ia_valid |=ATTR_TIMES_SET ; }else { -/* -* If times is NULL (or both times are UTIME_NOW), -* then we need to check permissions, because -* inode_change_ok() won't do it. -*/ - error = -EACCES ; -if (IS_IMMUTABLE (inode)) - goto mnt_drop_write_and_out; - -if (!inode_owner_or_capable (inode)) { - error =inode_permission (inode,MAY_WRITE ); -if (error) - goto mnt_drop_write_and_out; - } + newattrs.ia_valid |=ATTR_TOUCH ; } retry_deleg:mutex_lock (&inode->i_mutex);
@@ -112,7 +99,6 @@ retry_deleg: goto retry_deleg; } -mnt_drop_write_and_out:mnt_drop_write (path->mnt); out:return error;
include/linux/fs.h +1 -0
@@ -226,6 +226,7 @@ typedef void (dax_iodone_t)(struct buffe#define ATTR_KILL_PRIV (1 << 14)#define ATTR_OPEN (1 << 15)/* Truncating from open(O_TRUNC) */ #define ATTR_TIMES_SET (1 << 16) +#define ATTR_TOUCH (1 << 17)/* * Whiteout is represented by a char device. The following constants define the
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/vfs-move-permission-checking-into-notify_change-for-utimes-null.patch queue-4.4/fuse-listxattr-verify-xattr-list.patch queue-4.4/fuse-invalidate-dir-dentry-after-chmod.patch queue-4.4/fuse-fix-killing-sid-in-setattr.patch