sysfs: sysfs_sd_setattr set iattrs unconditionally
authorEric W. Biederman <ebiederm@xmission.com>
Thu, 4 Feb 2010 07:13:24 +0000 (23:13 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 23 Feb 2010 15:37:56 +0000 (07:37 -0800)
commit 7c0ff870d1ed287504a61ed865f3d728c757436b upstream.

There is currently a bug in sysfs_sd_setattr inherited from
sysfs_setattr in 2.6.32 where the first time we set the attributes
on a sysfs file we allocate backing store but do not set the
backing store attributes.  Resulting in overly restrictive
permissions on sysfs files.

The fix is to simply modify the code so that it always executes
when we update the sysfs attributes, as we did in 2.6.31 and earlier.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Tested-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fs/sysfs/inode.c

index e28cecf179f50d6c746312baac37b045a326d5da..02a022a3d47326823f8f0295f0eee2af0970e5c4 100644 (file)
@@ -94,30 +94,29 @@ int sysfs_setattr(struct dentry * dentry, struct iattr * iattr)
                if (!sd_attrs)
                        return -ENOMEM;
                sd->s_iattr = sd_attrs;
-       } else {
-               /* attributes were changed at least once in past */
-               iattrs = &sd_attrs->ia_iattr;
-
-               if (ia_valid & ATTR_UID)
-                       iattrs->ia_uid = iattr->ia_uid;
-               if (ia_valid & ATTR_GID)
-                       iattrs->ia_gid = iattr->ia_gid;
-               if (ia_valid & ATTR_ATIME)
-                       iattrs->ia_atime = timespec_trunc(iattr->ia_atime,
-                                       inode->i_sb->s_time_gran);
-               if (ia_valid & ATTR_MTIME)
-                       iattrs->ia_mtime = timespec_trunc(iattr->ia_mtime,
-                                       inode->i_sb->s_time_gran);
-               if (ia_valid & ATTR_CTIME)
-                       iattrs->ia_ctime = timespec_trunc(iattr->ia_ctime,
-                                       inode->i_sb->s_time_gran);
-               if (ia_valid & ATTR_MODE) {
-                       umode_t mode = iattr->ia_mode;
-
-                       if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
-                               mode &= ~S_ISGID;
-                       iattrs->ia_mode = sd->s_mode = mode;
-               }
+       }
+       /* attributes were changed at least once in past */
+       iattrs = &sd_attrs->ia_iattr;
+
+       if (ia_valid & ATTR_UID)
+               iattrs->ia_uid = iattr->ia_uid;
+       if (ia_valid & ATTR_GID)
+               iattrs->ia_gid = iattr->ia_gid;
+       if (ia_valid & ATTR_ATIME)
+               iattrs->ia_atime = timespec_trunc(iattr->ia_atime,
+                       inode->i_sb->s_time_gran);
+       if (ia_valid & ATTR_MTIME)
+               iattrs->ia_mtime = timespec_trunc(iattr->ia_mtime,
+                       inode->i_sb->s_time_gran);
+       if (ia_valid & ATTR_CTIME)
+               iattrs->ia_ctime = timespec_trunc(iattr->ia_ctime,
+                       inode->i_sb->s_time_gran);
+       if (ia_valid & ATTR_MODE) {
+               umode_t mode = iattr->ia_mode;
+
+               if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
+                       mode &= ~S_ISGID;
+               iattrs->ia_mode = sd->s_mode = mode;
        }
        return error;
 }