ANDROID: sdcardfs: Allow non-owners to touch
authorDaniel Rosenberg <drosen@google.com>
Fri, 20 Jan 2017 23:19:13 +0000 (15:19 -0800)
committerAmit Pundir <amit.pundir@linaro.org>
Fri, 3 Feb 2017 09:35:18 +0000 (15:05 +0530)
This modifies the permission checks in setattr to
allow for non-owners to modify the timestamp of
files to things other than the current time.
This still requires write access, as enforced by
the permission call, but relaxes the requirement
that the caller must be the owner, allowing those
with group permissions to change it as well.

Bug: 11118565
Change-Id: Ied31f0cce2797675c7ef179eeb4e088185adcbad
Signed-off-by: Daniel Rosenberg <drosen@google.com>
fs/sdcardfs/inode.c

index 76a6e8ad07361189b3bfa6827e08815ecc8f9c33..6f450e523675f0bacdfb47d7263abd564e08e086 100644 (file)
@@ -739,6 +739,11 @@ static int sdcardfs_setattr(struct vfsmount *mnt, struct dentry *dentry, struct
         * this user can change the lower inode: that should happen when
         * calling notify_change on the lower inode.
         */
+       /* prepare our own lower struct iattr (with the lower file) */
+       memcpy(&lower_ia, ia, sizeof(lower_ia));
+       /* Allow touch updating timestamps. A previous permission check ensures
+        * we have write access. Changes to mode, owner, and group are ignored*/
+       ia->ia_valid |= ATTR_FORCE;
        err = inode_change_ok(&tmp, ia);
 
        if (!err) {
@@ -764,8 +769,6 @@ static int sdcardfs_setattr(struct vfsmount *mnt, struct dentry *dentry, struct
        lower_mnt = lower_path.mnt;
        lower_inode = sdcardfs_lower_inode(inode);
 
-       /* prepare our own lower struct iattr (with the lower file) */
-       memcpy(&lower_ia, ia, sizeof(lower_ia));
        if (ia->ia_valid & ATTR_FILE)
                lower_ia.ia_file = sdcardfs_lower_file(ia->ia_file);