dev: Fix segmentation fault in VirtIOBlock
authorChun-Chen TK Hsu <chunchenhsu@google.com>
Fri, 6 Sep 2019 11:42:56 +0000 (19:42 +0800)
committerChun-Chen TK Hsu <chunchenhsu@google.com>
Fri, 6 Sep 2019 16:14:30 +0000 (16:14 +0000)
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>
src/dev/virtio/block.cc

index a602c3e29954a58c711b2f173db39b7f1afcd46e..cf7f01bf6762751eabb0e1a41b88b66db7b98ad9 100644 (file)
@@ -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;
         }