@@ -86,6 +86,19 @@ static int elf_resolve_sections(struct livepatch_elf *elf, const void *data)
delta < sizeof(Elf_Ehdr) ? "at ELF header" : "is past end");
return -EINVAL;
}
+ else if ( sec[i].sec->sh_addralign &&
+ sec[i].sec->sh_addr % sec[i].sec->sh_addralign )
+ {
+ dprintk(XENLOG_ERR, LIVEPATCH "%s: Section [%u] addr (%#"PRIxElfAddr") is not aligned properly (%#"PRIxElfAddr")\n",
+ elf->name, i, sec[i].sec->sh_addr, sec[i].sec->sh_addralign);
+ return -EINVAL;
+ }
+ else if ( sec[i].sec->sh_addralign & (sec[i].sec->sh_addralign - 1) )
+ {
+ dprintk(XENLOG_ERR, LIVEPATCH "%s: Section [%u] alignment (%#"PRIxElfAddr") is not supported\n",
+ elf->name, i, sec[i].sec->sh_addralign);
+ return -EOPNOTSUPP;
+ }
else if ( (sec[i].sec->sh_flags & (SHF_WRITE | SHF_ALLOC)) &&
sec[i].sec->sh_type == SHT_NOBITS &&
sec[i].sec->sh_size > LIVEPATCH_MAX_SIZE )
The ELF specification mentions nothing about the sh_size being modulo the sh_addralign. Only that sh_addr MUST be aligned on sh_addralign if sh_addralign is not zero or one. We on loading did not take this in-to account so this patch adds a check on the ELF file as it is being parsed. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> --- v1: Initial patch v2: Drop the check when loading it in memory Add check for alignment being anything but power of two (ignoring 0, and 1) Change dprintk to include hex values and print addr not size. v3: Change the two checks to be per Jan's recommendations. --- xen/common/livepatch_elf.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)