aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2001-11-09 14:49:18 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2001-11-09 14:49:18 +0000
commit8cffdb9707f6d2b19a8cf639f1ec159bb5f55695 (patch)
treed4581e099df031e1b344350a25bd9d55d15eb267 /kernel
parent552c2816d7c3f5ac4a909108c13bdbddf7c2fc48 (diff)
downloadandroid_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.c5
-rw-r--r--kernel/dir.c9
-rw-r--r--kernel/fuse_i.h7
-rw-r--r--kernel/inode.c5
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;