From: Christoph Hellwig Date: Tue, 19 Jan 2010 21:15:39 +0000 (+0100) Subject: block: prevent multiwrite_merge from creating too large iovecs X-Git-Tag: v0.13.0-rc0~1622 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0076bc0c1d93adcbc7f1af184e04902cf37e9ab8;p=thirdparty%2Fqemu.git block: prevent multiwrite_merge from creating too large iovecs If we go over the maximum number of iovecs support by syscall we get back EINVAL from the kernel which translate to I/O errors for the guest. Signed-off-by: Christoph Hellwig Signed-off-by: Anthony Liguori --- diff --git a/block.c b/block.c index 73c26ec4104..cde41295bd4 100644 --- a/block.c +++ b/block.c @@ -1689,6 +1689,10 @@ static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs, merge = bs->drv->bdrv_merge_requests(bs, &reqs[outidx], &reqs[i]); } + if (reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1 > IOV_MAX) { + merge = 0; + } + if (merge) { size_t size; QEMUIOVector *qiov = qemu_mallocz(sizeof(*qiov));