From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=36205 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Q7qUa-0005eG-4h for qemu-devel@nongnu.org; Thu, 07 Apr 2011 10:47:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q7qUY-0004wL-61 for qemu-devel@nongnu.org; Thu, 07 Apr 2011 10:47:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55194) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q7qUX-0004vx-QY for qemu-devel@nongnu.org; Thu, 07 Apr 2011 10:47:26 -0400 From: Kevin Wolf Date: Thu, 7 Apr 2011 16:49:24 +0200 Message-Id: <1302187764-16421-16-git-send-email-kwolf@redhat.com> In-Reply-To: <1302187764-16421-1-git-send-email-kwolf@redhat.com> References: <1302187764-16421-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 15/15] virtio-blk: fail unaligned requests List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: anthony@codemonkey.ws Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Christoph Hellwig Like all block drivers virtio-blk should not allow small than block size granularity access. But given that the protocol specifies a byte unit length field we currently accept such requests, which cause qemu to abort() in lower layers. Add checks to the main read and write handlers to catch them early. Reported-by: Conor Murphy Tested-by: Conor Murphy Signed-off-by: Christoph Hellwig Reviewed-by: Stefan Hajnoczi Signed-off-by: Kevin Wolf --- hw/virtio-blk.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index b14fb99..91e0394 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -290,6 +290,10 @@ static void virtio_blk_handle_write(VirtIOBlockReq *req, MultiReqBuffer *mrb) virtio_blk_rw_complete(req, -EIO); return; } + if (req->qiov.size % req->dev->conf->logical_block_size) { + virtio_blk_rw_complete(req, -EIO); + return; + } if (mrb->num_writes == 32) { virtio_submit_multiwrite(req->dev->bs, mrb); @@ -317,6 +321,10 @@ static void virtio_blk_handle_read(VirtIOBlockReq *req) virtio_blk_rw_complete(req, -EIO); return; } + if (req->qiov.size % req->dev->conf->logical_block_size) { + virtio_blk_rw_complete(req, -EIO); + return; + } acb = bdrv_aio_readv(req->dev->bs, sector, &req->qiov, req->qiov.size / BDRV_SECTOR_SIZE, -- 1.7.2.3