summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra G <raghavendra@gluster.com>2009-08-31 22:52:34 +0000
committerAnand V. Avati <avati@dev.gluster.com>2009-09-08 03:22:35 -0700
commitd6bc71ccb3a5265b01d188497213d797d7217c3d (patch)
tree394dc972b11d6820590b03c1941cd0a49eee2d78
parent8c95c2b69c08fa5c7d845e73d0e63fb2f001c511 (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
-rw-r--r--xlators/performance/quick-read/src/quick-read.c10
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);
}