[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v1 06/11] xsplice: Add helper elf routines



On Tue, Nov 03, 2015 at 06:16:03PM +0000, Ross Lagerwall wrote:
> Add some elf routines and data structures in preparation for loading an
> xsplice payload.
> 
> Signed-off-by: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
> ---
>  xen/common/Makefile           |   1 +
>  xen/common/xsplice_elf.c      | 122 
> ++++++++++++++++++++++++++++++++++++++++++
>  xen/include/xen/xsplice_elf.h |  44 +++++++++++++++
>  3 files changed, 167 insertions(+)
>  create mode 100644 xen/common/xsplice_elf.c
>  create mode 100644 xen/include/xen/xsplice_elf.h
> 
> diff --git a/xen/common/Makefile b/xen/common/Makefile
> index 1b17c9d..de7c08a 100644
> --- a/xen/common/Makefile
> +++ b/xen/common/Makefile
> @@ -57,6 +57,7 @@ obj-y += vsprintf.o
>  obj-y += wait.o
>  obj-y += xmalloc_tlsf.o
>  obj-y += xsplice.o
> +obj-y += xsplice_elf.o
>  
>  obj-bin-$(CONFIG_X86) += $(foreach n,decompress bunzip2 unxz unlzma unlzo 
> unlz4 earlycpio,$(n).init.o)
>  
> diff --git a/xen/common/xsplice_elf.c b/xen/common/xsplice_elf.c
> new file mode 100644
> index 0000000..13a9229
> --- /dev/null
> +++ b/xen/common/xsplice_elf.c
> @@ -0,0 +1,122 @@

Do you want to add your company copyright header here?

> +#include <xen/lib.h>
> +#include <xen/errno.h>
> +#include <xen/xsplice_elf.h>
> +
> +struct xsplice_elf_sec *xsplice_elf_sec_by_name(const struct xsplice_elf 
> *elf,
> +                                                const char *name)
> +{
> +    int i;

unsigned int ?

> +
> +    for ( i = 0; i < elf->hdr->e_shnum; i++ )
> +    {
> +        if ( !strcmp(name, elf->sec[i].name) )
> +            return &elf->sec[i];
> +    }
> +
> +    return NULL;
> +}
> +
> +static int elf_get_sections(struct xsplice_elf *elf, uint8_t *data)
> +{
> +    struct xsplice_elf_sec *sec;
> +    int i;

unsigned int;

Should we check the e_shnum for out of bound values? Hmm,
uint16t so not that bad..

> +
> +    sec = xmalloc_array(struct xsplice_elf_sec, elf->hdr->e_shnum);
> +    if ( !sec )
> +    {
> +        printk(XENLOG_ERR "Could not find section table\n");

Well that is not exactly right. It couldnt' allocate the memory.

Perhaps we should say:
        "Could not allocate memory for %s which has %u sections!\n", elf->name, 
elf->hdr->e_shnum);

> +        return -ENOMEM;
> +    }
> +
> +    for ( i = 0; i < elf->hdr->e_shnum; i++ )
> +    {
> +#ifdef CONFIG_ARM_32
> +        sec[i].sec = (Elf32_Shdr *)(data + elf->hdr->e_shoff +
> +                                    i * elf->hdr->e_shentsize);
> +#else
> +        sec[i].sec = (Elf64_Shdr *)(data + elf->hdr->e_shoff +
> +                                    i * elf->hdr->e_shentsize);
> +#endif

> +        sec[i].data = data + sec[i].sec->sh_offset;

We should validate that the 'sec[i].data' pointers are not outside
the memory allocated for 'data'.

> +    }
> +    elf->sec = sec;
> +
> +    return 0;
> +}
> +
> +static int elf_get_sym(struct xsplice_elf *elf, uint8_t *data)
> +{
> +    struct xsplice_elf_sec *symtab, *strtab_sec;
> +    struct xsplice_elf_sym *sym;
> +    const char *strtab;
> +    int i;
> +
> +    symtab = xsplice_elf_sec_by_name(elf, ".symtab");
> +    if ( !symtab )
> +    {
> +        printk(XENLOG_ERR "Could not find symbol table\n");
> +        return -EINVAL;
> +    }
> +
> +    strtab_sec = xsplice_elf_sec_by_name(elf, ".strtab");
> +    if ( !strtab_sec )
> +    {
> +        printk(XENLOG_ERR "Could not find string table\n");
> +        return -EINVAL;
> +    }
> +    strtab = (const char *)(data + strtab_sec->sec->sh_offset);

Should we do a check to make sure that 'strtab' is not bigger
than the amount of memory allocated for 'data'?

> +
> +    elf->nsym = symtab->sec->sh_size / symtab->sec->sh_entsize;
> +
> +    sym = xmalloc_array(struct xsplice_elf_sym, elf->nsym);

Perhaps also a validity check on the elf->nsym?..
> +    if ( !sym )
> +    {
> +        printk(XENLOG_ERR "Could not allocate memory for symbols\n");
> +        return -ENOMEM;
> +    }
> +
> +    for ( i = 0; i < elf->nsym; i++ )
> +    {
> +#ifdef CONFIG_ARM_32
> +        sym[i].sym = (Elf32_Sym *)(symtab->data + i * 
> symtab->sec->sh_entsize);
> +#else
> +        sym[i].sym = (Elf64_Sym *)(symtab->data + i * 
> symtab->sec->sh_entsize);
> +#endif
> +        sym[i].name = strtab + sym[i].sym->st_name;

Could we check that the 'sym[i].name is not outside the memory allocated
for data' ?
> +    }
> +    elf->sym = sym;
> +
> +    return 0;
> +}
> +
> +int xsplice_elf_load(struct xsplice_elf *elf, uint8_t *data, ssize_t len)
> +{
> +    const char *shstrtab;
> +    int i, rc;

unsigned int i;

> +
> +#ifdef CONFIG_ARM_32
> +    elf->hdr = (Elf32_Ehdr *)data;
> +#else
> +    elf->hdr = (Elf64_Ehdr *)data;
> +#endif
> +
> +    rc = elf_get_sections(elf, data);
> +    if ( rc )
> +        return rc;
> +
> +    shstrtab = (const char *)(data + 
> elf->sec[elf->hdr->e_shstrndx].sec->sh_offset);

if (shstrtab > data + len)
        return -EINVAL;

> +    for ( i = 0; i < elf->hdr->e_shnum; i++ )
> +        elf->sec[i].name = shstrtab + elf->sec[i].sec->sh_name;
> +
> +    rc = elf_get_sym(elf, data);
> +    if ( rc )
> +        return rc;
> +
> +    return 0;
> +}
> +
> +void xsplice_elf_free(struct xsplice_elf *elf)
> +{
> +    xfree(elf->sec);
> +    xfree(elf->sym);

elf->sec = NULL;
elf->sym = NULL

just in case..
> +}
> diff --git a/xen/include/xen/xsplice_elf.h b/xen/include/xen/xsplice_elf.h
> new file mode 100644
> index 0000000..bac0053
> --- /dev/null
> +++ b/xen/include/xen/xsplice_elf.h
> @@ -0,0 +1,44 @@
> +#ifndef __XEN_XSPLICE_ELF_H__
> +#define __XEN_XSPLICE_ELF_H__
> +
> +#include <xen/types.h>
> +#include <xen/elfstructs.h>
> +
> +/* The following describes an Elf file as consumed by xsplice. */
> +struct xsplice_elf_sec {
> +#ifdef CONFIG_ARM_32
> +    Elf32_Shdr *sec;
> +#else
> +    Elf64_Shdr *sec;
> +#endif
> +    const char *name;
> +    const uint8_t *data;           /* A pointer to the data section */
> +    uint8_t *load_addr;            /* A pointer to the allocated destination 
> */

Missing full stop.
> +};
> +
> +struct xsplice_elf_sym {
> +#ifdef CONFIG_ARM_32
> +    Elf32_Sym *sym;
> +#else
> +    Elf64_Sym *sym;
> +#endif
> +    const char *name;
> +};
> +
> +struct xsplice_elf {
> +#ifdef CONFIG_ARM_32
> +    Elf32_Ehdr *hdr;
> +#else
> +    Elf64_Ehdr *hdr;
> +#endif
> +    struct xsplice_elf_sec *sec;   /* Array of sections */
> +    struct xsplice_elf_sym *sym;   /* Array of symbols */

Missing full stop.
> +    int nsym;

unsigned int nsym;
> +};
> +
> +struct xsplice_elf_sec *xsplice_elf_sec_by_name(const struct xsplice_elf 
> *elf,
> +                                                const char *name);
> +int xsplice_elf_load(struct xsplice_elf *elf, uint8_t *data, ssize_t len);
> +void xsplice_elf_free(struct xsplice_elf *elf);
> +
> +#endif /* __XEN_XSPLICE_ELF_H__ */
> -- 
> 2.4.3
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.