Message ID | 1502116754-18867-3-git-send-email-peter.maydell@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | loader: Handle ELF files with overlapping zero-init data | expand |
On 08/07/2017 11:39 AM, Peter Maydell wrote: > Some ELF files have program headers that specify segments that > are of zero size. Ignore them, rather than trying to create > zero-length ROM blobs for them, because the zero-length blob > can falsely trigger the overlapping-ROM-blobs check. > > Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > --- > include/hw/elf_ops.h | 24 +++++++++++++++++------- > 1 file changed, 17 insertions(+), 7 deletions(-) > > diff --git a/include/hw/elf_ops.h b/include/hw/elf_ops.h > index 2e526d3..d192e7e 100644 > --- a/include/hw/elf_ops.h > +++ b/include/hw/elf_ops.h > @@ -451,14 +451,24 @@ static int glue(load_elf, SZ)(const char *name, int fd, > *pentry = ehdr.e_entry - ph->p_vaddr + ph->p_paddr; > } > > - if (load_rom) { > - snprintf(label, sizeof(label), "phdr #%d: %s", i, name); > - > - /* rom_add_elf_program() seize the ownership of 'data' */ > - rom_add_elf_program(label, data, file_size, mem_size, addr, as); > - } else { > - cpu_physical_memory_write(addr, data, file_size); > + if (mem_size == 0) { > + /* Some ELF files really do have segments of zero size; > + * just ignore them rather than trying to create empty > + * ROM blobs, because the zero-length blob can falsely > + * trigger the overlapping-ROM-blobs check. > + */ > g_free(data); > + } else { > + if (load_rom) { > + snprintf(label, sizeof(label), "phdr #%d: %s", i, name); > + > + /* rom_add_elf_program() seize the ownership of 'data' */ > + rom_add_elf_program(label, data, file_size, mem_size, > + addr, as); > + } else { > + cpu_physical_memory_write(addr, data, file_size); > + g_free(data); > + } > } > > total_size += mem_size; >
Tested-by: Hua Yanghao <huayanghao@gmail.com> On Mon, Aug 7, 2017 at 4:39 PM, Peter Maydell <peter.maydell@linaro.org> wrote: > Some ELF files have program headers that specify segments that > are of zero size. Ignore them, rather than trying to create > zero-length ROM blobs for them, because the zero-length blob > can falsely trigger the overlapping-ROM-blobs check. > > Signed-off-by: Peter Maydell <peter.maydell@linaro.org> > --- > include/hw/elf_ops.h | 24 +++++++++++++++++------- > 1 file changed, 17 insertions(+), 7 deletions(-) > > diff --git a/include/hw/elf_ops.h b/include/hw/elf_ops.h > index 2e526d3..d192e7e 100644 > --- a/include/hw/elf_ops.h > +++ b/include/hw/elf_ops.h > @@ -451,14 +451,24 @@ static int glue(load_elf, SZ)(const char *name, int fd, > *pentry = ehdr.e_entry - ph->p_vaddr + ph->p_paddr; > } > > - if (load_rom) { > - snprintf(label, sizeof(label), "phdr #%d: %s", i, name); > - > - /* rom_add_elf_program() seize the ownership of 'data' */ > - rom_add_elf_program(label, data, file_size, mem_size, addr, as); > - } else { > - cpu_physical_memory_write(addr, data, file_size); > + if (mem_size == 0) { > + /* Some ELF files really do have segments of zero size; > + * just ignore them rather than trying to create empty > + * ROM blobs, because the zero-length blob can falsely > + * trigger the overlapping-ROM-blobs check. > + */ > g_free(data); > + } else { > + if (load_rom) { > + snprintf(label, sizeof(label), "phdr #%d: %s", i, name); > + > + /* rom_add_elf_program() seize the ownership of 'data' */ > + rom_add_elf_program(label, data, file_size, mem_size, > + addr, as); > + } else { > + cpu_physical_memory_write(addr, data, file_size); > + g_free(data); > + } > } > > total_size += mem_size; > -- > 2.7.4 >
On 08/07/2017 07:39 AM, Peter Maydell wrote: > Some ELF files have program headers that specify segments that > are of zero size. Ignore them, rather than trying to create > zero-length ROM blobs for them, because the zero-length blob > can falsely trigger the overlapping-ROM-blobs check. > > Signed-off-by: Peter Maydell <peter.maydell@linaro.org> > --- > include/hw/elf_ops.h | 24 +++++++++++++++++------- > 1 file changed, 17 insertions(+), 7 deletions(-) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
diff --git a/include/hw/elf_ops.h b/include/hw/elf_ops.h index 2e526d3..d192e7e 100644 --- a/include/hw/elf_ops.h +++ b/include/hw/elf_ops.h @@ -451,14 +451,24 @@ static int glue(load_elf, SZ)(const char *name, int fd, *pentry = ehdr.e_entry - ph->p_vaddr + ph->p_paddr; } - if (load_rom) { - snprintf(label, sizeof(label), "phdr #%d: %s", i, name); - - /* rom_add_elf_program() seize the ownership of 'data' */ - rom_add_elf_program(label, data, file_size, mem_size, addr, as); - } else { - cpu_physical_memory_write(addr, data, file_size); + if (mem_size == 0) { + /* Some ELF files really do have segments of zero size; + * just ignore them rather than trying to create empty + * ROM blobs, because the zero-length blob can falsely + * trigger the overlapping-ROM-blobs check. + */ g_free(data); + } else { + if (load_rom) { + snprintf(label, sizeof(label), "phdr #%d: %s", i, name); + + /* rom_add_elf_program() seize the ownership of 'data' */ + rom_add_elf_program(label, data, file_size, mem_size, + addr, as); + } else { + cpu_physical_memory_write(addr, data, file_size); + g_free(data); + } } total_size += mem_size;
Some ELF files have program headers that specify segments that are of zero size. Ignore them, rather than trying to create zero-length ROM blobs for them, because the zero-length blob can falsely trigger the overlapping-ROM-blobs check. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> --- include/hw/elf_ops.h | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) -- 2.7.4