diff --git a/include/kernaux/multiboot2.h b/include/kernaux/multiboot2.h index a82a5e6..561511f 100644 --- a/include/kernaux/multiboot2.h +++ b/include/kernaux/multiboot2.h @@ -19,6 +19,8 @@ extern "C" { #define KERNAUX_MULTIBOOT2_DATA(ptr) (((uint8_t*)(ptr)) + sizeof(*(ptr))) +#define KERNAUX_MULTIBOOT2_TAG_ALIGN 8 + #define KERNAUX_MULTIBOOT2_HTAG_NEXT(tag_base) \ ((struct KernAux_Multiboot2_HTagBase*)KERNAUX_MULTIBOOT2_TAG_NEXT(tag_base)) #define KERNAUX_MULTIBOOT2_ITAG_NEXT(tag_base) \ diff --git a/src/multiboot2/header_is_valid.c b/src/multiboot2/header_is_valid.c index 3f7f14d..b3afef7 100644 --- a/src/multiboot2/header_is_valid.c +++ b/src/multiboot2/header_is_valid.c @@ -26,6 +26,10 @@ bool KernAux_Multiboot2_Header_is_valid( return false; } + if (multiboot2_header->total_size % KERNAUX_MULTIBOOT2_TAG_ALIGN != 0) { + return false; + } + if (multiboot2_header->checksum != KERNAUX_MULTIBOOT2_CHECKSUM( multiboot2_header->arch, diff --git a/src/multiboot2/info_is_valid.c b/src/multiboot2/info_is_valid.c index 64be3bd..36ce1c7 100644 --- a/src/multiboot2/info_is_valid.c +++ b/src/multiboot2/info_is_valid.c @@ -18,6 +18,10 @@ bool KernAux_Multiboot2_Info_is_valid( return false; } + if (multiboot2_info->total_size % KERNAUX_MULTIBOOT2_TAG_ALIGN != 0) { + return false; + } + const struct KernAux_Multiboot2_ITagBase *tag_base = (struct KernAux_Multiboot2_ITagBase*) KERNAUX_MULTIBOOT2_DATA(multiboot2_info);