diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/dev.c | 2 | ||||
-rw-r--r-- | kernel/dir.c | 3 | ||||
-rw-r--r-- | kernel/inode.c | 11 |
3 files changed, 12 insertions, 4 deletions
diff --git a/kernel/dev.c b/kernel/dev.c index daa464e..a31615d 100644 --- a/kernel/dev.c +++ b/kernel/dev.c @@ -632,7 +632,7 @@ int fuse_dev_init() } proc_fs_fuse->owner = THIS_MODULE; - proc_fuse_dev = create_proc_entry("dev", S_IFSOCK | 0600, proc_fs_fuse); + proc_fuse_dev = create_proc_entry("dev", S_IFSOCK | 0666, proc_fs_fuse); if(!proc_fuse_dev) { printk("fuse: failed to create entry in /proc/fs/fuse\n"); goto err; diff --git a/kernel/dir.c b/kernel/dir.c index 0fffcab..5fec669 100644 --- a/kernel/dir.c +++ b/kernel/dir.c @@ -409,8 +409,7 @@ static int _fuse_permission(struct inode *inode, int mask) keeping it open... */ return err; - } - else + } else return 0; } diff --git a/kernel/inode.c b/kernel/inode.c index d896965..257b41d 100644 --- a/kernel/inode.c +++ b/kernel/inode.c @@ -23,6 +23,10 @@ #define kstatfs statfs #endif +#ifndef FS_SAFE +#define FS_SAFE 0 +#endif + static void fuse_read_inode(struct inode *inode) { /* No op */ @@ -193,6 +197,11 @@ static int fuse_read_super(struct super_block *sb, void *data, int silent) struct inode *root; struct fuse_mount_data *d = data; + if(!capable(CAP_SYS_ADMIN)) { + if(d->flags & FUSE_ALLOW_OTHER) + return -EPERM; + } + sb->s_blocksize = PAGE_CACHE_SIZE; sb->s_blocksize_bits = PAGE_CACHE_SHIFT; sb->s_magic = FUSE_SUPER_MAGIC; @@ -246,7 +255,7 @@ static struct file_system_type fuse_fs_type = { .name = "fuse", .get_sb = fuse_get_sb, .kill_sb = kill_anon_super, - .fs_flags = 0 + .fs_flags = FS_SAFE, }; #else static struct super_block *fuse_read_super_compat(struct super_block *sb, |