diff options
author | Raghavendra G <raghavendra@gluster.com> | 2009-08-31 22:52:34 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-09-08 03:22:35 -0700 |
commit | d6bc71ccb3a5265b01d188497213d797d7217c3d (patch) | |
tree | 394dc972b11d6820590b03c1941cd0a49eee2d78 /xlators/performance/quick-read/src/quick-read.c | |
parent | 8c95c2b69c08fa5c7d845e73d0e63fb2f001c511 (diff) |
performance/quick-read: Fix access of freed memory in qr_open_cbk.
- It may so happen that current frame might be unwound and
local might be freed when waiting operations are resumed.
Hence store the information of whether this frame belongs
to an open call in a local variable, instead accessing the
flag from local at the end of qr_open_cbk.
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 231 (Quick-read: Fix access of freed memory in qr_open_cbk.)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=231
Diffstat (limited to 'xlators/performance/quick-read/src/quick-read.c')
-rw-r--r-- | xlators/performance/quick-read/src/quick-read.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/xlators/performance/quick-read/src/quick-read.c b/xlators/performance/quick-read/src/quick-read.c index 7bc912e3d..c63c920a0 100644 --- a/xlators/performance/quick-read/src/quick-read.c +++ b/xlators/performance/quick-read/src/quick-read.c @@ -293,8 +293,16 @@ qr_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, qr_file_t *qr_file = NULL; qr_fd_ctx_t *qr_fd_ctx = NULL; call_stub_t *stub = NULL, *tmp = NULL; + char is_open = 0; local = frame->local; + if (local == NULL) { + op_ret = -1; + op_errno = EINVAL; + } else { + is_open = local->is_open; + } + INIT_LIST_HEAD (&waiting_ops); ret = fd_ctx_get (fd, this, &value); @@ -347,7 +355,7 @@ qr_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, } } out: - if (local && local->is_open) { + if (is_open) { STACK_UNWIND (frame, op_ret, op_errno, fd); } |