summaryrefslogtreecommitdiff
path: root/src/dev/virtio
diff options
context:
space:
mode:
authorChun-Chen TK Hsu <chunchenhsu@google.com>2019-09-06 19:42:56 +0800
committerChun-Chen TK Hsu <chunchenhsu@google.com>2019-09-06 16:14:30 +0000
commit665b67e365b11e791ff23b833d866d9ca4ffee77 (patch)
tree2bb89f10aa001d4f2ea567b267c3d0ccc7321e9e /src/dev/virtio
parent36a575071cd460255ca67ec5bdd6862d9c164919 (diff)
downloadgem5-665b67e365b11e791ff23b833d866d9ca4ffee77.tar.xz
dev: Fix segmentation fault in VirtIOBlock
GEM5 got a segmentation fault when the size is large in VirtIOBlock::write. This change uses a vector to avoid this segmentation fault. Signed-off-by: Chun-Chen TK Hsu <chunchenhsu@google.com> Change-Id: I26272686a6e7e39cdf2389657ecd38ce90261144 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20679 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com> Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'src/dev/virtio')
-rw-r--r--src/dev/virtio/block.cc12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/dev/virtio/block.cc b/src/dev/virtio/block.cc
index a602c3e29..cf7f01bf6 100644
--- a/src/dev/virtio/block.cc
+++ b/src/dev/virtio/block.cc
@@ -71,7 +71,7 @@ VirtIOBlock::Status
VirtIOBlock::read(const BlkRequest &req, VirtDescriptor *desc_chain,
size_t off_data, size_t size)
{
- uint8_t data[size];
+ std::vector<uint8_t> data(size);
uint64_t sector(req.sector);
DPRINTF(VIOBlock, "Read request starting @ sector %i (size: %i)\n",
@@ -81,14 +81,14 @@ VirtIOBlock::read(const BlkRequest &req, VirtDescriptor *desc_chain,
panic("Unexpected request/sector size relationship\n");
for (Addr offset = 0; offset < size; offset += SectorSize) {
- if (image.read(data + offset, sector) != SectorSize) {
+ if (image.read(&data[offset], sector) != SectorSize) {
warn("Failed to read sector %i\n", sector);
return S_IOERR;
}
++sector;
}
- desc_chain->chainWrite(off_data, data, size);
+ desc_chain->chainWrite(off_data, &data[0], size);
return S_OK;
}
@@ -97,7 +97,7 @@ VirtIOBlock::Status
VirtIOBlock::write(const BlkRequest &req, VirtDescriptor *desc_chain,
size_t off_data, size_t size)
{
- uint8_t data[size];
+ std::vector<uint8_t> data(size);
uint64_t sector(req.sector);
DPRINTF(VIOBlock, "Write request starting @ sector %i (size: %i)\n",
@@ -107,10 +107,10 @@ VirtIOBlock::write(const BlkRequest &req, VirtDescriptor *desc_chain,
panic("Unexpected request/sector size relationship\n");
- desc_chain->chainRead(off_data, data, size);
+ desc_chain->chainRead(off_data, &data[0], size);
for (Addr offset = 0; offset < size; offset += SectorSize) {
- if (image.write(data + offset, sector) != SectorSize) {
+ if (image.write(&data[offset], sector) != SectorSize) {
warn("Failed to write sector %i\n", sector);
return S_IOERR;
}