diff options
author | Amar Tumballi <amar@gluster.com> | 2010-08-18 08:56:56 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2010-08-18 07:41:58 -0700 |
commit | b189d31f61ac3436bf0ad9ae2bff13efccbc06d0 (patch) | |
tree | 7f6b0716b8f5bd9c8688f3469631c8126955026c | |
parent | 1aa2219484e040a950d55d9414e2b7e77df37fe7 (diff) |
fuse: prevent NULL dereference in case resolve on path failed.
Signed-off-by: Amar Tumballi <amar@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 1391 ()
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1391
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 39 | ||||
-rw-r--r-- | xlators/mount/fuse/src/fuse-resolve.c | 4 |
2 files changed, 40 insertions, 3 deletions
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index ac8295b96..798b87b05 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -240,6 +240,13 @@ fuse_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, void fuse_lookup_resume (fuse_state_t *state) { + if (!state->loc.parent && !state->loc.inode) { + gf_log ("fuse", GF_LOG_ERROR, "failed to resolve path %s", + state->loc.path); + send_fuse_err (state->this, state->finh, ENOENT); + free_fuse_state (state); + return; + } if (!state->loc.inode) state->loc.inode = inode_new (state->loc.parent->table); @@ -1004,6 +1011,14 @@ fuse_readlink (xlator_t *this, fuse_in_header_t *finh, void *msg) void fuse_mknod_resume (fuse_state_t *state) { + if (!state->loc.parent) { + gf_log ("fuse", GF_LOG_ERROR, "failed to resolve path %s", + state->loc.path); + send_fuse_err (state->this, state->finh, ENOENT); + free_fuse_state (state); + return; + } + if (!state->loc.inode) state->loc.inode = inode_new (state->loc.parent->table); else @@ -1056,6 +1071,14 @@ fuse_mknod (xlator_t *this, fuse_in_header_t *finh, void *msg) void fuse_mkdir_resume (fuse_state_t *state) { + if (!state->loc.parent) { + gf_log ("fuse", GF_LOG_ERROR, "failed to resolve path %s", + state->loc.path); + send_fuse_err (state->this, state->finh, ENOENT); + free_fuse_state (state); + return; + } + if (!state->loc.inode) state->loc.inode = inode_new (state->loc.parent->table); else @@ -1182,6 +1205,14 @@ fuse_rmdir (xlator_t *this, fuse_in_header_t *finh, void *msg) void fuse_symlink_resume (fuse_state_t *state) { + if (!state->loc.parent) { + gf_log ("fuse", GF_LOG_ERROR, "failed to resolve path %s", + state->loc.path); + send_fuse_err (state->this, state->finh, ENOENT); + free_fuse_state (state); + return; + } + if (!state->loc.inode) state->loc.inode = inode_new (state->loc.parent->table); else @@ -1486,6 +1517,14 @@ fuse_create_resume (fuse_state_t *state) { fd_t *fd = NULL; + if (!state->loc.parent) { + gf_log ("fuse", GF_LOG_ERROR, "failed to resolve path %s", + state->loc.path); + send_fuse_err (state->this, state->finh, ENOENT); + free_fuse_state (state); + return; + } + if (!state->loc.inode) state->loc.inode = inode_new (state->loc.parent->table); else diff --git a/xlators/mount/fuse/src/fuse-resolve.c b/xlators/mount/fuse/src/fuse-resolve.c index b90ef3d5f..77a55cd70 100644 --- a/xlators/mount/fuse/src/fuse-resolve.c +++ b/xlators/mount/fuse/src/fuse-resolve.c @@ -661,8 +661,6 @@ gf_resolve_done (fuse_state_t *state) static int gf_resolve_all (fuse_state_t *state) { - xlator_t *this = NULL; - if (state->resolve_now == NULL) { state->resolve_now = &state->resolve; @@ -682,7 +680,7 @@ gf_resolve_all (fuse_state_t *state) gf_resolve_done (state); } else { - gf_log (this->name, GF_LOG_ERROR, + gf_log ("fuse-resolve", GF_LOG_ERROR, "Invalid pointer for state->resolve_now"); } |