aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2013-01-16 11:33:52 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-08-04 04:50:53 -0400
commit07221c8c2109ae56d9f83cd0644498069ed7cfed (patch)
tree4d2628eaebaf93e64fd6d1e99a380c1ca0dc5937
parentf4b5b99f18cd5984120ab2334aeadc5384f260cf (diff)
xen/blkback: Check device permissions before allowing OP_DISCARD
commit 604c499cbbcc3d5fe5fb8d53306aa0fae1990109 upstream. We need to make sure that the device is not RO or that the request is not past the number of sectors we want to issue the DISCARD operation for. This fixes CVE-2013-2140. Acked-by: Jan Beulich <JBeulich@suse.com> Acked-by: Ian Campbell <Ian.Campbell@citrix.com> [v1: Made it pr_warn instead of pr_debug] Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/block/xen-blkback/blkback.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index dd5b2fed97e9..d81dfca755d1 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -647,7 +647,18 @@ static int dispatch_discard_io(struct xen_blkif *blkif,
647 int status = BLKIF_RSP_OKAY; 647 int status = BLKIF_RSP_OKAY;
648 struct block_device *bdev = blkif->vbd.bdev; 648 struct block_device *bdev = blkif->vbd.bdev;
649 unsigned long secure; 649 unsigned long secure;
650 struct phys_req preq;
651
652 preq.sector_number = req->u.discard.sector_number;
653 preq.nr_sects = req->u.discard.nr_sectors;
650 654
655 err = xen_vbd_translate(&preq, blkif, WRITE);
656 if (err) {
657 pr_warn(DRV_PFX "access denied: DISCARD [%llu->%llu] on dev=%04x\n",
658 preq.sector_number,
659 preq.sector_number + preq.nr_sects, blkif->vbd.pdevice);
660 goto fail_response;
661 }
651 blkif->st_ds_req++; 662 blkif->st_ds_req++;
652 663
653 xen_blkif_get(blkif); 664 xen_blkif_get(blkif);
@@ -658,7 +669,7 @@ static int dispatch_discard_io(struct xen_blkif *blkif,
658 err = blkdev_issue_discard(bdev, req->u.discard.sector_number, 669 err = blkdev_issue_discard(bdev, req->u.discard.sector_number,
659 req->u.discard.nr_sectors, 670 req->u.discard.nr_sectors,
660 GFP_KERNEL, secure); 671 GFP_KERNEL, secure);
661 672fail_response:
662 if (err == -EOPNOTSUPP) { 673 if (err == -EOPNOTSUPP) {
663 pr_debug(DRV_PFX "discard op failed, not supported\n"); 674 pr_debug(DRV_PFX "discard op failed, not supported\n");
664 status = BLKIF_RSP_EOPNOTSUPP; 675 status = BLKIF_RSP_EOPNOTSUPP;