|
@@ -45,6 +45,19 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr)
|
|
|
int err;
|
|
|
struct dentry *upperdentry;
|
|
|
|
|
|
+ /*
|
|
|
+ * Check for permissions before trying to copy-up. This is redundant
|
|
|
+ * since it will be rechecked later by ->setattr() on upper dentry. But
|
|
|
+ * without this, copy-up can be triggered by just about anybody.
|
|
|
+ *
|
|
|
+ * We don't initialize inode->size, which just means that
|
|
|
+ * inode_newsize_ok() will always check against MAX_LFS_FILESIZE and not
|
|
|
+ * check for a swapfile (which this won't be anyway).
|
|
|
+ */
|
|
|
+ err = inode_change_ok(dentry->d_inode, attr);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
err = ovl_want_write(dentry);
|
|
|
if (err)
|
|
|
goto out;
|