]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
dm-rq: don't dereference request payload after ending request
authorJens Axboe <axboe@fb.com>
Fri, 24 Feb 2017 20:19:32 +0000 (13:19 -0700)
committerJens Axboe <axboe@fb.com>
Fri, 24 Feb 2017 20:19:32 +0000 (13:19 -0700)
Bart reported a case where dm would crash with use-after-free
poison. This is due to dm_softirq_done() accessing memory
associated with a request after calling end_request on it.
This is most visible on !blk-mq, since we free the memory
immediately for that case.

Reported-by: Bart Van Assche <bart.vanassche@sandisk.com>
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Fixes: eb8db831be80 ("dm: always defer request allocation to the owner of the request_queue")
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/md/dm-rq.c

index 67d76f21fecd9a6e48d73861a19ef8c41914e0dd..28955b94d2b26f47d7c54217d84c2a8a11af692a 100644 (file)
@@ -328,13 +328,15 @@ static void dm_softirq_done(struct request *rq)
        int rw;
 
        if (!clone) {
-               rq_end_stats(tio->md, rq);
+               struct mapped_device *md = tio->md;
+
+               rq_end_stats(md, rq);
                rw = rq_data_dir(rq);
                if (!rq->q->mq_ops)
                        blk_end_request_all(rq, tio->error);
                else
                        blk_mq_end_request(rq, tio->error);
-               rq_completed(tio->md, rw, false);
+               rq_completed(md, rw, false);
                return;
        }