diff --git a/src/multiboot2/is_valid.c b/src/multiboot2/is_valid.c index b26476f..52fbf01 100644 --- a/src/multiboot2/is_valid.c +++ b/src/multiboot2/is_valid.c @@ -229,6 +229,7 @@ unsigned char KernAux_Multiboot2_Tag_MemoryMap_is_valid( return ( tag->base.type == KERNAUX_MULTIBOOT2_TAGTYPE_MEMORY_MAP && tag->base.size >= 16 && + tag->entry_size > 0 && tag->entry_size % 8 == 0 && (tag->base.size - 16) % tag->entry_size == 0 ); diff --git a/tests/test_multiboot2_validation.c b/tests/test_multiboot2_validation.c index 673aa5c..864479d 100644 --- a/tests/test_multiboot2_validation.c +++ b/tests/test_multiboot2_validation.c @@ -421,6 +421,16 @@ static const struct { }, }; +static const struct KernAux_Multiboot2_Tag_MemoryMap +tag_memory_map_with_empty_data_invalid_entry_size_zero = { + .base = { + .type = KERNAUX_MULTIBOOT2_TAGTYPE_MEMORY_MAP, + .size = 16, + }, + .entry_size = 0, + .entry_version = 0, +}; + static const struct KernAux_Multiboot2_Tag_MemoryMap tag_memory_map_with_empty_data_invalid_entry_size_not_mul8 = { .base = { @@ -938,6 +948,10 @@ int main() &tag_memory_map_with_some_large_data_items_invalid_size.tag.base )); + assert(!KernAux_Multiboot2_TagBase_is_valid( + &tag_memory_map_with_empty_data_invalid_entry_size_zero.base + )); + assert(!KernAux_Multiboot2_TagBase_is_valid( &tag_memory_map_with_empty_data_invalid_entry_size_not_mul8.base )); @@ -1090,6 +1104,10 @@ int main() &tag_memory_map_with_some_large_data_items_invalid_size.tag )); + assert(!KernAux_Multiboot2_Tag_MemoryMap_is_valid( + &tag_memory_map_with_empty_data_invalid_entry_size_zero + )); + assert(!KernAux_Multiboot2_Tag_MemoryMap_is_valid( &tag_memory_map_with_empty_data_invalid_entry_size_not_mul8 ));