aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fuse/dir.c
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2005-11-28 16:44:16 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-28 17:42:26 -0500
commit2827d0b23b7279d0a717eea4029efeef2e1b0183 (patch)
tree3d4be5d41404eec385027f434a83abad7f28111d /fs/fuse/dir.c
parentf007d5c961448170d0ec2998b1a80eef054b6235 (diff)
[PATCH] fuse: check for invalid node ID in fuse_create_open()
Check for invalid node ID values in the new atomic create+open method. Signed-off-by: Miklos Szeredi <miklos@szeredi.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/fuse/dir.c')
-rw-r--r--fs/fuse/dir.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index 3a47247a889e..51f5da652771 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -87,6 +87,11 @@ static int dir_alias(struct inode *inode)
87 return 0; 87 return 0;
88} 88}
89 89
90static inline int invalid_nodeid(u64 nodeid)
91{
92 return !nodeid || nodeid == FUSE_ROOT_ID;
93}
94
90static struct dentry_operations fuse_dentry_operations = { 95static struct dentry_operations fuse_dentry_operations = {
91 .d_revalidate = fuse_dentry_revalidate, 96 .d_revalidate = fuse_dentry_revalidate,
92}; 97};
@@ -110,7 +115,7 @@ static int fuse_lookup_iget(struct inode *dir, struct dentry *entry,
110 fuse_lookup_init(req, dir, entry, &outarg); 115 fuse_lookup_init(req, dir, entry, &outarg);
111 request_send(fc, req); 116 request_send(fc, req);
112 err = req->out.h.error; 117 err = req->out.h.error;
113 if (!err && (!outarg.nodeid || outarg.nodeid == FUSE_ROOT_ID)) 118 if (!err && invalid_nodeid(outarg.nodeid))
114 err = -EIO; 119 err = -EIO;
115 if (!err) { 120 if (!err) {
116 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation, 121 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
@@ -206,7 +211,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
206 } 211 }
207 212
208 err = -EIO; 213 err = -EIO;
209 if (!S_ISREG(outentry.attr.mode)) 214 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
210 goto out_free_ff; 215 goto out_free_ff;
211 216
212 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation, 217 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
@@ -263,7 +268,7 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
263 fuse_put_request(fc, req); 268 fuse_put_request(fc, req);
264 return err; 269 return err;
265 } 270 }
266 if (!outarg.nodeid || outarg.nodeid == FUSE_ROOT_ID) { 271 if (invalid_nodeid(outarg.nodeid)) {
267 fuse_put_request(fc, req); 272 fuse_put_request(fc, req);
268 return -EIO; 273 return -EIO;
269 } 274 }