diff mbox series

[2/2] loader: Ignore zero-sized ELF segments

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

Commit Message

Peter Maydell Aug. 7, 2017, 2:39 p.m. UTC
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

Comments

Philippe Mathieu-Daudé Aug. 7, 2017, 8:58 p.m. UTC | #1
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;

>
Hua Yanghao Aug. 8, 2017, 8:18 a.m. UTC | #2
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

>
Richard Henderson Aug. 11, 2017, 1:51 p.m. UTC | #3
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 mbox series

Patch

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;