[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-stable] [PATCH for-2.0 45/47] qcow2: Limit snapshot table size
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-stable] [PATCH for-2.0 45/47] qcow2: Limit snapshot table size |
Date: |
Wed, 26 Mar 2014 13:06:07 +0100 |
From: Kevin Wolf <address@hidden>
Even with a limit of 64k snapshots, each snapshot could have a filename
and an ID with up to 64k, which would still lead to pretty large
allocations, which could potentially lead to qemu aborting. Limit the
total size of the snapshot table to an average of 1k per entry when
the limit of 64k snapshots is fully used. This should be plenty for any
reasonable user.
This also fixes potential integer overflows of s->snapshot_size.
Suggested-by: Max Reitz <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block/qcow2-snapshot.c | 15 ++++++++++++++-
block/qcow2.h | 4 ++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c
index 5db4f30..0aa9def 100644
--- a/block/qcow2-snapshot.c
+++ b/block/qcow2-snapshot.c
@@ -116,8 +116,14 @@ int qcow2_read_snapshots(BlockDriverState *bs)
}
offset += name_size;
sn->name[name_size] = '\0';
+
+ if (offset - s->snapshots_offset > QCOW_MAX_SNAPSHOTS_SIZE) {
+ ret = -EFBIG;
+ goto fail;
+ }
}
+ assert(offset - s->snapshots_offset <= INT_MAX);
s->snapshots_size = offset - s->snapshots_offset;
return 0;
@@ -138,7 +144,7 @@ static int qcow2_write_snapshots(BlockDriverState *bs)
uint32_t nb_snapshots;
uint64_t snapshots_offset;
} QEMU_PACKED header_data;
- int64_t offset, snapshots_offset;
+ int64_t offset, snapshots_offset = 0;
int ret;
/* compute the size of the snapshots */
@@ -150,7 +156,14 @@ static int qcow2_write_snapshots(BlockDriverState *bs)
offset += sizeof(extra);
offset += strlen(sn->id_str);
offset += strlen(sn->name);
+
+ if (offset > QCOW_MAX_SNAPSHOTS_SIZE) {
+ ret = -EFBIG;
+ goto fail;
+ }
}
+
+ assert(offset <= INT_MAX);
snapshots_size = offset;
/* Allocate space for the new snapshot list */
diff --git a/block/qcow2.h b/block/qcow2.h
index f28e7d9..b49424b 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -48,6 +48,10 @@
* (128 GB for 512 byte clusters, 2 EB for 2 MB clusters) */
#define QCOW_MAX_L1_SIZE 0x2000000
+/* Allow for an average of 1k per snapshot table entry, should be plenty of
+ * space for snapshot names and IDs */
+#define QCOW_MAX_SNAPSHOTS_SIZE (1024 * QCOW_MAX_SNAPSHOTS)
+
/* indicate that the refcount of the referenced cluster is exactly one. */
#define QCOW_OFLAG_COPIED (1ULL << 63)
/* indicate that the cluster is compressed (they never have the copied flag) */
--
1.8.5.3
- [Qemu-stable] [PATCH for-2.0 40/47] block: Limit request size (CVE-2014-0143), (continued)
- [Qemu-stable] [PATCH for-2.0 40/47] block: Limit request size (CVE-2014-0143), Stefan Hajnoczi, 2014/03/26
- [Qemu-stable] [PATCH for-2.0 42/47] qcow2: Fix NULL dereference in qcow2_open() error path (CVE-2014-0146), Stefan Hajnoczi, 2014/03/26
- [Qemu-stable] [PATCH for-2.0 41/47] qcow2: Fix copy_sectors() with VM state, Stefan Hajnoczi, 2014/03/26
- [Qemu-stable] [PATCH for-2.0 46/47] parallels: Fix catalog size integer overflow (CVE-2014-0143), Stefan Hajnoczi, 2014/03/26
- [Qemu-stable] [PATCH for-2.0 43/47] qcow2: Fix L1 allocation size in qcow2_snapshot_load_tmp() (CVE-2014-0145), Stefan Hajnoczi, 2014/03/26
- [Qemu-stable] [PATCH for-2.0 45/47] qcow2: Limit snapshot table size,
Stefan Hajnoczi <=
- [Qemu-stable] [PATCH for-2.0 47/47] parallels: Sanity check for s->tracks (CVE-2014-0142), Stefan Hajnoczi, 2014/03/26
- [Qemu-stable] [PATCH for-2.0 44/47] qcow2: Check maximum L1 size in qcow2_snapshot_load_tmp() (CVE-2014-0143), Stefan Hajnoczi, 2014/03/26
- [Qemu-stable] [PATCH for-2.0 27/47] qcow2: Avoid integer overflow in get_refcount (CVE-2014-0143), Stefan Hajnoczi, 2014/03/26
- [Qemu-stable] [PATCH for-2.0 30/47] qcow2: Protect against some integer overflows in bdrv_check, Stefan Hajnoczi, 2014/03/26
- [Qemu-stable] [PATCH for-2.0 31/47] qcow2: Fix new L1 table size check (CVE-2014-0143), Stefan Hajnoczi, 2014/03/26