[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v2 06/13] blkdebug: Audit for read/write 64-bit clea
From: |
Eric Blake |
Subject: |
[Qemu-block] [PATCH v2 06/13] blkdebug: Audit for read/write 64-bit cleanness |
Date: |
Wed, 14 Nov 2018 20:03:27 -0600 |
Since the block layer is never supposed to hand us an offset + bytes
that would exceed off_t, we can assert this in rule_check(). With
that in place, there is nothing else in the pread, pwrite, or
pwrite_zeroes code paths that can't handle inputs larger than 2G
(even if the block layer currently never hands us something
that large); update the refresh_limits callback to document this
fact, when the user doesn't specify an override.
For a user override, we have to change the QAPI type to 'uint64'
instead of 'int'. At the same time, we can also change 'align'
to 'int32' to match the existing checks in blkdebug_open() that
alignment is always smaller than 2G.
Signed-off-by: Eric Blake <address@hidden>
---
qapi/block-core.json | 2 +-
block/blkdebug.c | 17 +++++------------
2 files changed, 6 insertions(+), 13 deletions(-)
diff --git a/qapi/block-core.json b/qapi/block-core.json
index d4fe710836e..32f0edd189f 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -3122,7 +3122,7 @@
{ 'struct': 'BlockdevOptionsBlkdebug',
'data': { 'image': 'BlockdevRef',
'*config': 'str',
- '*align': 'int', '*max-transfer': 'int32',
+ '*align': 'int32', '*max-transfer': 'uint64',
'*opt-write-zero': 'int32', '*max-write-zero': 'int32',
'*opt-discard': 'int32', '*max-discard': 'int32',
'*inject-error': ['BlkdebugInjectErrorOptions'],
diff --git a/block/blkdebug.c b/block/blkdebug.c
index 0759452925b..be4d65f86a0 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -415,9 +415,7 @@ static int blkdebug_open(BlockDriverState *bs, QDict
*options, int flags,
align = MAX(s->align, bs->file->bs->bl.request_alignment);
s->max_transfer = qemu_opt_get_size(opts, "max-transfer", 0);
- if (s->max_transfer &&
- (s->max_transfer >= INT_MAX ||
- !QEMU_IS_ALIGNED(s->max_transfer, align))) {
+ if (s->max_transfer && !QEMU_IS_ALIGNED(s->max_transfer, align)) {
error_setg(errp, "Cannot meet constraints with max-transfer %" PRIu64,
s->max_transfer);
goto out;
@@ -477,6 +475,7 @@ static int rule_check(BlockDriverState *bs, uint64_t
offset, uint64_t bytes)
int error;
bool immediately;
+ assert(offset <= INT64_MAX - bytes);
QSIMPLEQ_FOREACH(rule, &s->active_rules, active_next) {
uint64_t inject_offset = rule->options.inject.offset;
@@ -517,9 +516,7 @@ blkdebug_co_preadv(BlockDriverState *bs, uint64_t offset,
uint64_t bytes,
/* Sanity check block layer guarantees */
assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment));
assert(QEMU_IS_ALIGNED(bytes, bs->bl.request_alignment));
- if (bs->bl.max_transfer) {
- assert(bytes <= bs->bl.max_transfer);
- }
+ assert(bytes <= bs->bl.max_transfer);
err = rule_check(bs, offset, bytes);
if (err) {
@@ -538,9 +535,7 @@ blkdebug_co_pwritev(BlockDriverState *bs, uint64_t offset,
uint64_t bytes,
/* Sanity check block layer guarantees */
assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment));
assert(QEMU_IS_ALIGNED(bytes, bs->bl.request_alignment));
- if (bs->bl.max_transfer) {
- assert(bytes <= bs->bl.max_transfer);
- }
+ assert(bytes <= bs->bl.max_transfer);
err = rule_check(bs, offset, bytes);
if (err) {
@@ -865,9 +860,7 @@ static void blkdebug_refresh_limits(BlockDriverState *bs,
Error **errp)
if (s->align) {
bs->bl.request_alignment = s->align;
}
- if (s->max_transfer) {
- bs->bl.max_transfer = s->max_transfer;
- }
+ bs->bl.max_transfer = s->max_transfer ?: INT64_MAX;
if (s->opt_write_zero) {
bs->bl.pwrite_zeroes_alignment = s->opt_write_zero;
}
--
2.17.2
- [Qemu-block] [PATCH v2 01/13] qcow2: Prefer byte-based calls into bs->file, (continued)
- [Qemu-block] [PATCH v2 01/13] qcow2: Prefer byte-based calls into bs->file, Eric Blake, 2018/11/14
- [Qemu-block] [PATCH v2 02/13] vdi: Switch to byte-based calls, Eric Blake, 2018/11/14
- [Qemu-block] [PATCH v2 03/13] vvfat: Switch to byte-based calls, Eric Blake, 2018/11/14
- [Qemu-block] [PATCH v2 04/13] block: Removed unused sector-based blocking I/O, Eric Blake, 2018/11/14
- [Qemu-block] [PATCH v2 05/13] block: Switch to 64-bit bl.max_transfer, Eric Blake, 2018/11/14
[Qemu-block] [PATCH v2 06/13] blkdebug: Audit for read/write 64-bit cleanness,
Eric Blake <=
[Qemu-block] [PATCH v2 07/13] blklogwrites: Audit for read/write 64-bit cleanness, Eric Blake, 2018/11/14
[Qemu-block] [PATCH v2 11/13] qcow2: Audit for read/write 64-bit cleanness, Eric Blake, 2018/11/14
[Qemu-block] [PATCH v2 08/13] crypto: Audit for read/write 64-bit cleanness, Eric Blake, 2018/11/14
[Qemu-block] [PATCH v2 09/13] RFC: crypto: Rely on block layer for fragmentation, Eric Blake, 2018/11/14
[Qemu-block] [PATCH v2 10/13] file-posix: Audit for read/write 64-bit cleanness, Eric Blake, 2018/11/14
[Qemu-block] [PATCH v2 12/13] block: Document need for audit of read/write 64-bit cleanness, Eric Blake, 2018/11/14
[Qemu-block] [PATCH v2 13/13] block: Enforce non-zero bl.max_transfer, Eric Blake, 2018/11/14