X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Ffiledisk.c;h=bf1aaf852dee15115e73b531bf74d55219d8b7b9;hb=504a6fd3bf01d7299ec69f80d5117dea3014ea28;hp=b007ace3aa70180a4a39afa5ef35d1b02586f783;hpb=6d6988cc9c8bac21d96afd800076afe0915cf2cd;p=palacios.git diff --git a/palacios/src/devices/filedisk.c b/palacios/src/devices/filedisk.c index b007ace..bf1aaf8 100644 --- a/palacios/src/devices/filedisk.c +++ b/palacios/src/devices/filedisk.c @@ -20,10 +20,10 @@ #include #include -#include +#include #include -#ifndef CONFIG_DEBUG_FILEDISK +#ifndef V3_CONFIG_DEBUG_FILEDISK #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -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;