diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-11-05 20:45:59 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-11-05 20:45:59 -0400 |
commit | c093ee4f07f46d3a835841cafa07514fa94878d2 (patch) | |
tree | aafb816d450e3e3dd352c650b50fe2202919dd2c /drivers/block/floppy.c | |
parent | 433039e97f672b81e6c8f6daef385dcf035c6e29 (diff) |
floppy: fix use-after-free in module load failure path
Commit 488211844e0c ("floppy: switch to one queue per drive instead of
sharing a queue") introduced a use-after-free. We do "put_disk()" on
the disk device _before_ we then clean up the queue associated with that
disk.
Move the put_disk() down to avoid dereferencing a free'd data structure.
Cc: Jens Axboe <jaxboe@fusionio.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Reported-and-tested-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/block/floppy.c')
-rw-r--r-- | drivers/block/floppy.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 767107cce982..8f19b380ca83 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
@@ -4363,9 +4363,9 @@ out_unreg_blkdev: | |||
4363 | out_put_disk: | 4363 | out_put_disk: |
4364 | while (dr--) { | 4364 | while (dr--) { |
4365 | del_timer(&motor_off_timer[dr]); | 4365 | del_timer(&motor_off_timer[dr]); |
4366 | put_disk(disks[dr]); | ||
4367 | if (disks[dr]->queue) | 4366 | if (disks[dr]->queue) |
4368 | blk_cleanup_queue(disks[dr]->queue); | 4367 | blk_cleanup_queue(disks[dr]->queue); |
4368 | put_disk(disks[dr]); | ||
4369 | } | 4369 | } |
4370 | return err; | 4370 | return err; |
4371 | } | 4371 | } |