Commit e956edd0 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Linus Torvalds

[PATCH] fuse: fix dereferencing dentry parent

There's no locking for ->d_revalidate, so fuse_dentry_revalidate() should use
dget_parent() instead of simply dereferencing ->d_parent.

Due to topology changes in the directory tree the parent could become negative
or be destroyed while being used.  There hasn't been any reports about this
yet.
Signed-off-by: default avatarMiklos Szeredi <miklos@szeredi.hu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent d2a85164
...@@ -138,6 +138,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd) ...@@ -138,6 +138,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
struct fuse_entry_out outarg; struct fuse_entry_out outarg;
struct fuse_conn *fc; struct fuse_conn *fc;
struct fuse_req *req; struct fuse_req *req;
struct dentry *parent;
/* Doesn't hurt to "reset" the validity timeout */ /* Doesn't hurt to "reset" the validity timeout */
fuse_invalidate_entry_cache(entry); fuse_invalidate_entry_cache(entry);
...@@ -151,8 +152,10 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd) ...@@ -151,8 +152,10 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
if (IS_ERR(req)) if (IS_ERR(req))
return 0; return 0;
fuse_lookup_init(req, entry->d_parent->d_inode, entry, &outarg); parent = dget_parent(entry);
fuse_lookup_init(req, parent->d_inode, entry, &outarg);
request_send(fc, req); request_send(fc, req);
dput(parent);
err = req->out.h.error; err = req->out.h.error;
/* Zero nodeid is same as -ENOENT */ /* Zero nodeid is same as -ENOENT */
if (!err && !outarg.nodeid) if (!err && !outarg.nodeid)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment