mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
ovl: setattr: check permissions before copy-up
[ Upstream commit cf9a6784f7 ]
Without this copy-up of a file can be forced, even without actually being
allowed to do anything on the file.
[Arnd Bergmann] include <linux/pagemap.h> for PAGE_CACHE_SIZE (used by
MAX_LFS_FILESIZE definition).
Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
Cc: <stable@vger.kernel.org>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
This commit is contained in:
committed by
Sasha Levin
parent
3d51d36e71
commit
c8e1bebf86
@@ -45,6 +45,19 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr)
|
|||||||
int err;
|
int err;
|
||||||
struct dentry *upperdentry;
|
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);
|
err = ovl_want_write(dentry);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/namei.h>
|
#include <linux/namei.h>
|
||||||
|
#include <linux/pagemap.h>
|
||||||
#include <linux/xattr.h>
|
#include <linux/xattr.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/mount.h>
|
#include <linux/mount.h>
|
||||||
@@ -847,6 +848,7 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sb->s_stack_depth = 0;
|
sb->s_stack_depth = 0;
|
||||||
|
sb->s_maxbytes = MAX_LFS_FILESIZE;
|
||||||
if (ufs->config.upperdir) {
|
if (ufs->config.upperdir) {
|
||||||
if (!ufs->config.workdir) {
|
if (!ufs->config.workdir) {
|
||||||
pr_err("overlayfs: missing 'workdir'\n");
|
pr_err("overlayfs: missing 'workdir'\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user