diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2001-11-09 14:49:18 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2001-11-09 14:49:18 +0000 |
commit | 8cffdb9707f6d2b19a8cf639f1ec159bb5f55695 (patch) | |
tree | d4581e099df031e1b344350a25bd9d55d15eb267 /kernel | |
parent | 552c2816d7c3f5ac4a909108c13bdbddf7c2fc48 (diff) | |
download | android_external_fuse-8cffdb9707f6d2b19a8cf639f1ec159bb5f55695.tar.gz android_external_fuse-8cffdb9707f6d2b19a8cf639f1ec159bb5f55695.tar.bz2 android_external_fuse-8cffdb9707f6d2b19a8cf639f1ec159bb5f55695.zip |
preparing for release
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/dev.c | 5 | ||||
-rw-r--r-- | kernel/dir.c | 9 | ||||
-rw-r--r-- | kernel/fuse_i.h | 7 | ||||
-rw-r--r-- | kernel/inode.c | 5 |
4 files changed, 22 insertions, 4 deletions
diff --git a/kernel/dev.c b/kernel/dev.c index 1ff6342..d183616 100644 --- a/kernel/dev.c +++ b/kernel/dev.c @@ -325,6 +325,8 @@ static struct fuse_conn *new_conn(void) if(fc != NULL) { fc->sb = NULL; fc->file = NULL; + fc->flags = 0; + fc->uid = 0; init_waitqueue_head(&fc->waitq); INIT_LIST_HEAD(&fc->pending); INIT_LIST_HEAD(&fc->processing); @@ -397,8 +399,7 @@ int fuse_dev_init() } proc_fs_fuse->owner = THIS_MODULE; - proc_fuse_dev = create_proc_entry("dev", S_IFSOCK | S_IRUGO | S_IWUGO, - proc_fs_fuse); + proc_fuse_dev = create_proc_entry("dev", S_IFSOCK | 0600, 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 87f7241..9a3d4ee 100644 --- a/kernel/dir.c +++ b/kernel/dir.c @@ -303,6 +303,15 @@ static int fuse_link(struct dentry *entry, struct inode *newdir, static int fuse_permission(struct inode *inode, int mask) { + struct fuse_conn *fc = INO_FC(inode); + + /* (too) simple protection for non-privileged mounts */ + if(fc->uid) { + if(current->fsuid == fc->uid) + return 0; + else + return -EACCES; + } return 0; } diff --git a/kernel/fuse_i.h b/kernel/fuse_i.h index 721af55..32106af 100644 --- a/kernel/fuse_i.h +++ b/kernel/fuse_i.h @@ -13,7 +13,6 @@ #include <linux/fs.h> #include <linux/list.h> #include <linux/spinlock.h> -#include <linux/rwsem.h> #define MAX_CLEARED 256 @@ -31,6 +30,12 @@ struct fuse_conn { /** The opened client device */ struct file *file; + /** The user id for this mount */ + uid_t uid; + + /** The fuse mount flags for this mount */ + unsigned int flags; + /** The client wait queue */ wait_queue_head_t waitq; diff --git a/kernel/inode.c b/kernel/inode.c index d4d573a..3a78040 100644 --- a/kernel/inode.c +++ b/kernel/inode.c @@ -41,9 +41,10 @@ static void fuse_put_super(struct super_block *sb) spin_lock(&fuse_lock); fc->sb = NULL; + fc->uid = 0; + fc->flags = 0; fuse_release_conn(fc); spin_unlock(&fuse_lock); - } static struct super_operations fuse_super_operations = { @@ -130,6 +131,8 @@ static struct super_block *fuse_read_super(struct super_block *sb, goto err; fc->sb = sb; + fc->flags = d->flags; + fc->uid = d->uid; spin_unlock(&fuse_lock); return sb; |