diff options
author | Vegard Nossum <vegard.nossum@oracle.com> | 2013-09-05 07:00:14 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2013-11-08 11:10:27 -0500 |
commit | ea5ec76d76da9279d12027c1828544c5ccbe7932 (patch) | |
tree | 0ce18ebc97696b04df2be341238b977c588b2fb5 /drivers/block | |
parent | c47206e25f28232ff979994c32758c82841d81cd (diff) |
xen/blkback: fix reference counting
If the permission check fails, we drop a reference to the blkif without
having taken it in the first place. The bug was introduced in commit
604c499cbbcc3d5fe5fb8d53306aa0fae1990109 (xen/blkback: Check device
permissions before allowing OP_DISCARD).
Cc: stable@vger.kernel.org
Cc: Jan Beulich <JBeulich@suse.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/xen-blkback/blkback.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index bf4b9d282c04..6620b73d0490 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c | |||
@@ -887,6 +887,8 @@ static int dispatch_discard_io(struct xen_blkif *blkif, | |||
887 | unsigned long secure; | 887 | unsigned long secure; |
888 | struct phys_req preq; | 888 | struct phys_req preq; |
889 | 889 | ||
890 | xen_blkif_get(blkif); | ||
891 | |||
890 | preq.sector_number = req->u.discard.sector_number; | 892 | preq.sector_number = req->u.discard.sector_number; |
891 | preq.nr_sects = req->u.discard.nr_sectors; | 893 | preq.nr_sects = req->u.discard.nr_sectors; |
892 | 894 | ||
@@ -899,7 +901,6 @@ static int dispatch_discard_io(struct xen_blkif *blkif, | |||
899 | } | 901 | } |
900 | blkif->st_ds_req++; | 902 | blkif->st_ds_req++; |
901 | 903 | ||
902 | xen_blkif_get(blkif); | ||
903 | secure = (blkif->vbd.discard_secure && | 904 | secure = (blkif->vbd.discard_secure && |
904 | (req->u.discard.flag & BLKIF_DISCARD_SECURE)) ? | 905 | (req->u.discard.flag & BLKIF_DISCARD_SECURE)) ? |
905 | BLKDEV_DISCARD_SECURE : 0; | 906 | BLKDEV_DISCARD_SECURE : 0; |