From 427a2153d3f8509e34a8caf58612f7ed03a6d9ec Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 13 Jan 2010 16:26:41 -0500 Subject: [PATCH] access to already freed job structure fixed by statements reoredering --- redis.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/redis.c b/redis.c index 59981cffe..036d3a6f7 100644 --- a/redis.c +++ b/redis.c @@ -7579,6 +7579,12 @@ static void vmCancelThreadedIOJob(robj *o) { if (compareStringObjects(job->key,o) == 0) { redisLog(REDIS_DEBUG,"*** CANCELED %p (%s)\n", (void*)job, (char*)o->ptr); + /* Mark the pages as free since the swap didn't happened + * or happened but is now discarded. */ + if (job->type == REDIS_IOJOB_DO_SWAP) + vmMarkPagesFree(job->page,job->pages); + /* Cancel the job. It depends on the list the job is + * living in. */ switch(i) { case 0: /* io_newjobs */ /* If the job was yet not processed the best thing to do @@ -7591,10 +7597,6 @@ static void vmCancelThreadedIOJob(robj *o) { job->canceled = 1; break; } - /* Mark the pages as free since the swap didn't happened - * or happened but is not discarded. */ - if (job->type == REDIS_IOJOB_DO_SWAP) - vmMarkPagesFree(job->page,job->pages); /* Finally we have to adjust the storage type of the object * in order to "UNDO" the operaiton. */ if (o->storage == REDIS_VM_LOADING)