10/6/21 23:29, Eric Blake wrote:
On Wed, Oct 06, 2021 at 03:17:16PM +0200, Vladimir Sementsov-Ogievskiy wrote:
1. Convert bytes in BlkAioEmAIOCB:
aio->bytes is only passed to already int64_t interfaces, and set in
blk_aio_prwv, which is updated here.
2. For all updated functions parameter type becomes wider so callers
are safe.
3. In blk_aio_prwv we only store bytes to BlkAioEmAIOCB, which is
updated here.
4. Other updated functions are wrappers on blk_aio_prwv.
Note that blk_aio_preadv and blk_aio_pwritev become safer: before this
commit, it's theoretically possible to pass qiov with size exceeding
INT_MAX, which than converted to int argument of blk_aio_prwv. Now it's
converted to int64_t which is a lot better. Still add assertions.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com>
---
include/sysemu/block-backend.h | 4 ++--
block/block-backend.c | 13 ++++++++-----
2 files changed, 10 insertions(+), 7 deletions(-)
@@ -1530,6 +1531,7 @@ BlockAIOCB *blk_aio_preadv(BlockBackend *blk, int64_t
offset,
QEMUIOVector *qiov, BdrvRequestFlags flags,
BlockCompletionFunc *cb, void *opaque)
{
+ assert(qiov->size <= INT64_MAX);
I hope this doesn't cause 32-bit compilers to warn about an
always-true expression; but if it does, we'll figure something out.
That's not enough for me to ask for you to respin this, though, so:
Reviewed-by: Eric Blake <ebl...@redhat.com>
So, here we need
assert((uint64_t)qiov->size <= INT64_MAX);
as in recent fix by Hanna.
Eric, will you stage this as continuation of 64bit series, or do we wait for
Kevin or Hanna, or for me resending it with this small fix and your wording
fixes?
--
Best regards,
Vladimir