vm: zero sector array; perform overflow checks
This commit is contained in:
@@ -165,6 +165,7 @@ void vm_sparse_init(void)
|
|||||||
data_size_to_string(sector_bytes, sector_size_str, sizeof sector_size_str);
|
data_size_to_string(sector_bytes, sector_size_str, sizeof sector_size_str);
|
||||||
|
|
||||||
sector_array = memblock_alloc(sizeof(vm_sector_t) * nr_sectors, 8);
|
sector_array = memblock_alloc(sizeof(vm_sector_t) * nr_sectors, 8);
|
||||||
|
memset(sector_array, 0x00, sizeof(vm_sector_t) * nr_sectors);
|
||||||
sector_array_count = nr_sectors;
|
sector_array_count = nr_sectors;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < nr_sectors; i++) {
|
for (unsigned int i = 0; i < nr_sectors; i++) {
|
||||||
@@ -215,10 +216,13 @@ vm_page_t *vm_page_get_sparse(phys_addr_t addr)
|
|||||||
{
|
{
|
||||||
size_t sector_number, page_number;
|
size_t sector_number, page_number;
|
||||||
phys_addr_to_sector_and_index(addr, §or_number, &page_number);
|
phys_addr_to_sector_and_index(addr, §or_number, &page_number);
|
||||||
|
if (sector_number >= sector_array_count) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
vm_sector_t *sector = §or_array[sector_number];
|
vm_sector_t *sector = §or_array[sector_number];
|
||||||
|
|
||||||
if (!sector->s_pages) {
|
if (!sector->s_pages || page_number >= vm_page_order_to_pages(sector->s_size)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user