[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 10/14] nbd/client: Reject inaccessible tail of incons
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PULL 10/14] nbd/client: Reject inaccessible tail of inconsistent server |
Date: |
Mon, 1 Apr 2019 09:08:59 -0500 |
The NBD spec suggests that a server should never advertise a size
inconsistent with its minimum block alignment, as that tail is
effectively inaccessible to a compliant client obeying those block
constraints. Since we have a habit of rounding up rather than
truncating, to avoid losing the last few bytes of user input, and we
cannot access the tail when the server advertises bogus block sizing,
abort the connection to alert the server to fix their bug. And
rejecting such servers matches what we already did for a min_block
that was not a power of 2 or which was larger than max_block.
Does not impact either qemu (which always sends properly aligned
sizes) or nbdkit (which does not send minimum block requirements yet);
so this is mostly aimed at new NBD server implementations, and ensures
that the rest of our code can assume the size is aligned.
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Reviewed-by: Vladimir Sementsov-Ogievskiy <address@hidden>
---
nbd/client.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/nbd/client.c b/nbd/client.c
index de7da48246b..427980bdd22 100644
--- a/nbd/client.c
+++ b/nbd/client.c
@@ -426,6 +426,14 @@ static int nbd_opt_info_or_go(QIOChannel *ioc, uint32_t
opt,
nbd_send_opt_abort(ioc);
return -1;
}
+ if (info->min_block &&
+ !QEMU_IS_ALIGNED(info->size, info->min_block)) {
+ error_setg(errp, "export size %" PRIu64 "is not multiple of "
+ "minimum block size %" PRIu32, info->size,
+ info->min_block);
+ nbd_send_opt_abort(ioc);
+ return -1;
+ }
trace_nbd_receive_negotiate_size_flags(info->size, info->flags);
break;
--
2.20.1
- [Qemu-devel] [PULL 00/14] NBD patches for 4.0-rc2, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 01/14] qemu-img: Report bdrv_block_status failures, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 03/14] nbd: Don't lose server's error to NBD_CMD_BLOCK_STATUS, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 04/14] nbd: Permit simple error to NBD_CMD_BLOCK_STATUS, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 02/14] nbd: Tolerate some server non-compliance in NBD_CMD_BLOCK_STATUS, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 05/14] qemu-img: Gracefully shutdown when map can't finish, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 06/14] nbd-client: Work around server BLOCK_STATUS misalignment at EOF, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 10/14] nbd/client: Reject inaccessible tail of inconsistent server,
Eric Blake <=
- [Qemu-devel] [PULL 11/14] nbd/client: Support qemu-img convert from unaligned size, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 08/14] nbd/client: Lower min_block for block-status, unaligned size, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 09/14] nbd/client: Report offsets in bdrv_block_status, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 07/14] iotests: Add 241 to test NBD on unaligned images, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 12/14] block: Add bdrv_get_request_alignment(), Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 14/14] nbd/client: Trace server noncompliance on structured reads, Eric Blake, 2019/04/01
- [Qemu-devel] [PULL 13/14] nbd/server: Advertise actual minimum block size, Eric Blake, 2019/04/01