X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Ffiledisk.c;h=bf1aaf852dee15115e73b531bf74d55219d8b7b9;hb=6b32ab71071174408dba942dab82adc2c8324643;hp=f7fe7ec8c699061025ebb54f55844e4048e79c5b;hpb=284cd2cc7083fbb37293bf5e2638aeadd366807f;p=palacios.git diff --git a/palacios/src/devices/filedisk.c b/palacios/src/devices/filedisk.c index f7fe7ec..bf1aaf8 100644 --- a/palacios/src/devices/filedisk.c +++ b/palacios/src/devices/filedisk.c @@ -80,6 +80,12 @@ static int read(uint8_t * buf, uint64_t lba, uint64_t num_bytes, void * private_ PrintDebug("Reading %d bytes from %p to %p\n", (uint32_t)num_bytes, (uint8_t *)(disk->disk_image + lba), buf); + if (lba + num_bytes > disk->capacity) { + PrintError("Out of bounds read: lba=%llu, num_bytes=%llu, capacity=%llu\n", + lba, num_bytes, disk->capacity); + return -1; + } + return read_all(disk->fd, buf, lba, num_bytes); } @@ -89,6 +95,13 @@ static int write(uint8_t * buf, uint64_t lba, uint64_t num_bytes, void * private PrintDebug("Writing %d bytes from %p to %p\n", (uint32_t)num_bytes, buf, (uint8_t *)(disk->disk_image + lba)); + if (lba + num_bytes > disk->capacity) { + PrintError("Out of bounds read: lba=%llu, num_bytes=%llu, capacity=%llu\n", + lba, num_bytes, disk->capacity); + return -1; + } + + return write_all(disk->fd, buf, lba, num_bytes); } @@ -96,7 +109,7 @@ static int write(uint8_t * buf, uint64_t lba, uint64_t num_bytes, void * private static uint64_t get_capacity(void * private_data) { struct disk_state * disk = (struct disk_state *)private_data; - PrintDebug("Querying RAMDISK capacity %d\n", + PrintDebug("Querying FILEDISK capacity %d\n", (uint32_t)(disk->capacity)); return disk->capacity;