From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: keir@xen.org, andrew.cooper3@citrix.com,
ian.jackson@eu.citrix.com, mpohlack@amazon.com, tim@xen.org,
ross.lagerwall@citrix.com, sasha.levin@oracle.com,
xen-devel@lists.xenproject.org
Subject: Re: [PATCH v8.1 10/27] xsplice: Add helper elf routines
Date: Mon, 18 Apr 2016 01:53:52 -0400 [thread overview]
Message-ID: <20160418055351.GA26968@localhost.localdomain> (raw)
In-Reply-To: <5714063B02000078000E6AE0@prv-mh.provo.novell.com>
. snip..
> >+static int elf_resolve_sections(struct xsplice_elf *elf, const void *data)
> >+{
> >+ struct xsplice_elf_sec *sec;
> >+ unsigned int i;
> >+ Elf_Off delta;
> >+ int rc;
> >+
> >+ /* xsplice_elf_load sanity checked e_shnum. */
> >+ sec = xmalloc_array(struct xsplice_elf_sec, elf->hdr->e_shnum);
> >+ if ( !sec )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE"%s: Could not allocate memory for section table!\n",
> >+ elf->name);
> >+ return -ENOMEM;
> >+ }
> >+
> >+ elf->sec = sec;
> >+
> >+ delta = elf->hdr->e_shoff + elf->hdr->e_shnum * elf->hdr->e_shentsize;
>
> I think Andrew had asked this before - are we not worried of overflow here?
Yes. That ends up being checked in xsplice_header_check. Added comment
here.
>
> >+ if ( delta > elf->len )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE "%s: Section table is past end of payload!\n",
> >+ elf->name);
> >+ return -EINVAL;
> >+ }
> >+
> >+ for ( i = 1; i < elf->hdr->e_shnum; i++ )
> >+ {
> >+ delta = elf->hdr->e_shoff + i * elf->hdr->e_shentsize;
> >+
> >+ sec[i].sec = (void *)data + delta;
>
> Casting away constness is one of the main reasons I complain about casts in
> general. If you really need to modify some fields in the section header, you should
> imo cast away constness just there. But even better would be if you left the
In earlier reviews you said that casting away constness in
function would be a big no no.
> section header alone.
I modify sec[i].sec->sh_entsize in calc_section
>
> >+ delta = sec[i].sec->sh_offset;
> >+
> >+ /*
> >+ * N.B. elf_resolve_section_names, elf_get_sym skip this check as
> >+ * we do it here.
> >+ */
> >+ if ( delta && (delta + sec[i].sec->sh_size > elf->len) )
>
> Allowing delta to be zero here seems suspicious: Are you doing that because
> some sections come without data (and hence without offset)? In that case you'd
> better skip the check on those section types (e.g. SHT_NOBITS) only. In fact
> the offset being below the end of the ELF header would likely indicate a broken
> image.
The loop (earlier) had started at 0 so the delta could have been zero.
Anyhow that not being the case anymore I will just do:
if ( !delta )
return -EINVAL;
>
> >+ /* Name is populated in xsplice_elf_sections_name. */
>
> Stale function name afaict.
>
> >+ /*
> >+ * elf->symtab->sec->sh_link would point to the right section
> >+ * but we hadn't finished parsing all the sections.
> >+ */
> >+ if ( elf->symtab->sec->sh_link > elf->hdr->e_shnum )
>
> >= (and I know I had asked before to check all these bounds checks for off
> by one errors)
>
> >+ if ( !elf->symtab->sec->sh_size ||
> >+ elf->symtab->sec->sh_entsize < sizeof(Elf_Sym) )
>
> || sh_size % sh_entsize
>
> >+ /*
> >+ * There can be multiple SHT_STRTAB (.shstrtab, .strtab) so pick one
> >+ * associated with the symbol table.
> >+ */
>
> ... pick the one ...
>
> >+static int elf_resolve_section_names(struct xsplice_elf *elf, const void *data)
> >+{
> >+ const char *shstrtab;
> >+ unsigned int i;
> >+ Elf_Off offset, delta;
> >+ struct xsplice_elf_sec *sec;
> >+ int rc;
> >+
> >+ /*
> >+ * The elf->sec[0 -> e_shnum] structures have been verified by
> >+ * elf_resolve_sections. Find file offset for section string table
> >+ * (normally called .shstrtab)
> >+ */
> >+ sec = &elf->sec[elf->hdr->e_shstrndx];
> >+
> >+ rc = elf_verify_strtab(sec);
> >+ if ( rc )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE "%s: Section string table is corrupted\n",
> >+ elf->name);
> >+ return rc;
> >+ }
> >+
> >+ /* Verified in elf_resolve_sections but just in case. */
> >+ offset = sec->sec->sh_offset;
> >+ ASSERT(offset < elf->len && (offset + sec->sec->sh_size <= elf->len));
> >+
> >+ shstrtab = data + offset;
> >+
> >+ for ( i = 1; i < elf->hdr->e_shnum; i++ )
> >+ {
> >+ delta = elf->sec[i].sec->sh_name;
> >+
> >+ if ( delta && delta >= sec->sec->sh_size )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE "%s: shstrtab [%u] data is past end of payload!\n",
> >+ elf->name, i);
>
> Isn't this redundant with the check in elf_resolve_sections()? Or is this needed
> because the one here runs before that other one?
We don't verify sh_name in elf_resolve_sections.
This is where we check that sh_name is within the shstrtab.
>
> >+static int elf_get_sym(struct xsplice_elf *elf, const void *data)
> >+{
> >+ const struct xsplice_elf_sec *symtab_sec, *strtab_sec;
> >+ struct xsplice_elf_sym *sym;
> >+ unsigned int i, delta, offset, nsym;
> >+
> >+ symtab_sec = elf->symtab;
> >+ strtab_sec = elf->strtab;
> >+
> >+ /* Pointers arithmetic to get file offset. */
> >+ offset = strtab_sec->data - data;
> >+
> >+ /* Checked already in elf_resolve_sections, but just in case. */
> >+ ASSERT(offset == strtab_sec->sec->sh_offset);
> >+ ASSERT(offset < elf->len && (offset + strtab_sec->sec->sh_size <= elf->len));
> >+
> >+ /* symtab_sec->data was computed in elf_resolve_sections. */
> >+ ASSERT((symtab_sec->sec->sh_offset + data) == symtab_sec->data);
> >+
> >+ /* No need to check values as elf_resolve_sections did it. */
> >+ nsym = symtab_sec->sec->sh_size / symtab_sec->sec->sh_entsize;
> >+
> >+ sym = xmalloc_array(struct xsplice_elf_sym, nsym);
> >+ if ( !sym )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE "%s: Could not allocate memory for symbols\n",
> >+ elf->name);
> >+ return -ENOMEM;
> >+ }
> >+
> >+ /* So we don't leak memory. */
> >+ elf->sym = sym;
> >+
> >+ for ( i = 1; i < nsym; i++ )
> >+ {
> >+ Elf_Sym *s = &((Elf_Sym *)symtab_sec->data)[i];
> >+
> >+ /* If st->name is STN_UNDEF zero, the check will always be true. */
> >+ delta = s->st_name;
> >+
> >+ if ( delta && (delta > strtab_sec->sec->sh_size) )
>
> Now here I don't see why you special case delta being zero, the more with the
> comment right above.
That one is stale. Removed the 'if ( delta)' part and the comment.
>
> >+static int xsplice_header_check(const struct xsplice_elf *elf)
> >+{
> >+ const Elf_Ehdr *hdr = elf->hdr;
> >+
> >+ if ( sizeof(*elf->hdr) > elf->len )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE "%s: Section header is bigger than payload!\n",
> >+ elf->name);
> >+ return -EINVAL;
> >+ }
> >+
> >+ if ( !IS_ELF(*hdr) )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE "%s: Not an ELF payload!\n", elf->name);
> >+ return -EINVAL;
> >+ }
> >+
> >+ if ( hdr->e_ident[EI_CLASS] != ELFCLASS64 ||
> >+ hdr->e_ident[EI_DATA] != ELFDATA2LSB ||
> >+ hdr->e_ident[EI_OSABI] != ELFOSABI_SYSV ||
> >+ hdr->e_type != ET_REL ||
> >+ hdr->e_phnum != 0 )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE "%s: Invalid ELF payload!\n", elf->name);
> >+ return -EOPNOTSUPP;
> >+ }
> >+
> >+ if ( elf->hdr->e_shstrndx == SHN_UNDEF )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE "%s: Section name idx is undefined!?\n",
> >+ elf->name);
> >+ return -EINVAL;
> >+ }
> >+
> >+ /* Check that section name index is within the sections. */
> >+ if ( elf->hdr->e_shstrndx >= elf->hdr->e_shnum )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE "%s: Section name idx (%u) is past end of sections (%u)!\n",
> >+ elf->name, elf->hdr->e_shstrndx, elf->hdr->e_shnum);
> >+ return -EINVAL;
> >+ }
> >+
> >+ if ( elf->hdr->e_shnum > 64 )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE "%s: Too many (%u) sections!\n",
> >+ elf->name, elf->hdr->e_shnum);
> >+ return -EINVAL;
>
> This isn't invalid, but unsupported.
>
> >+ if ( elf->hdr->e_shoff > elf->len )
> >+ {
> >+ dprintk(XENLOG_ERR, XSPLICE "%s: Bogus e_shoff!\n", elf->name);
> >+ return -EINVAL;
> >+ }
>
> If this check is needed, then >=. But I think it should be redundant with the more
> complete one in elf_resolve_sections().
This is the overflow check Andrew asked for.
>
> >+struct xsplice_elf_sec {
> >+ Elf_Shdr *sec; /* Hooked up in elf_resolve_sections.*/
>
> const
>
> >+struct xsplice_elf_sym {
> >+ Elf_Sym *sym;
>
> const
That will make 'xsplice_elf_resolve_symbols' unhappy:
elf->sym[i].sym->st_value = (unsigned
long)symbols_lookup_by_name(elf->sym[i].name);
Unless I cast away constness.
>
> Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-04-18 5:54 UTC|newest]
Thread overview: 126+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-13 22:01 [PATCH v8.1] xSplice v1 design and implementation Konrad Rzeszutek Wilk
2016-04-13 22:01 ` [PATCH v8.1 01/27] Revert "libxc/libxl/python/xenstat/ocaml: Use new XEN_VERSION hypercall" Konrad Rzeszutek Wilk
2016-04-13 22:01 ` [PATCH v8.1 02/27] Revert "HYPERCALL_version_op. New hypercall mirroring XENVER_ but sane." Konrad Rzeszutek Wilk
2016-04-14 16:14 ` Jan Beulich
2016-04-13 22:01 ` [PATCH v8.1 03/27] xsplice: Design document Konrad Rzeszutek Wilk
2016-04-13 22:01 ` [PATCH v8.1 04/27] xen/xsplice: Hypervisor implementation of XEN_XSPLICE_op Konrad Rzeszutek Wilk
2016-04-14 16:36 ` Jan Beulich
2016-04-15 2:28 ` Konrad Rzeszutek Wilk
2016-04-17 8:05 ` Jan Beulich
2016-04-18 7:48 ` Konrad Rzeszutek Wilk
2016-04-18 16:33 ` Jan Beulich
2016-04-19 10:14 ` Konrad Rzeszutek Wilk
2016-04-13 22:01 ` [PATCH v8.1 05/27] libxc: Implementation of XEN_XSPLICE_op in libxc Konrad Rzeszutek Wilk
2016-04-13 22:01 ` [PATCH v8.1 06/27] xen-xsplice: Tool to manipulate xsplice payloads Konrad Rzeszutek Wilk
2016-04-13 22:01 ` [PATCH v8.1 07/27] arm/x86: Use struct virtual_region to do bug, symbol, and (x86) exception tables lookup Konrad Rzeszutek Wilk
2016-04-14 16:50 ` Jan Beulich
2016-04-13 22:01 ` [PATCH v8.1 08/27] arm/x86/vmap: Add vmalloc_xen, vfree_xen and vm_init_type Konrad Rzeszutek Wilk
2016-04-17 20:17 ` Jan Beulich
2016-04-13 22:01 ` [PATCH v8.1 09/27] x86/mm: Introduce modify_xen_mappings() Konrad Rzeszutek Wilk
2016-04-14 4:07 ` Jan Beulich
2016-04-14 13:34 ` Konrad Rzeszutek Wilk
2016-04-13 22:01 ` [PATCH v8.1 10/27] xsplice: Add helper elf routines Konrad Rzeszutek Wilk
2016-04-17 20:55 ` Jan Beulich
2016-04-18 5:53 ` Konrad Rzeszutek Wilk [this message]
2016-04-18 6:23 ` Jan Beulich
2016-04-20 16:07 ` Konrad Rzeszutek Wilk
2016-04-20 16:59 ` Jan Beulich
2016-04-13 22:01 ` [PATCH v8.1 11/27] xsplice: Implement payload loading Konrad Rzeszutek Wilk
2016-04-18 6:16 ` Jan Beulich
2016-04-20 15:59 ` Konrad Rzeszutek Wilk
2016-04-20 17:05 ` Jan Beulich
2016-04-20 17:36 ` Konrad Rzeszutek Wilk
2016-04-21 6:41 ` Jan Beulich
2016-04-21 15:15 ` Konrad Rzeszutek Wilk
2016-04-21 15:36 ` Jan Beulich
2016-04-21 16:47 ` Konrad Rzeszutek Wilk
2016-04-22 7:40 ` Jan Beulich
2016-04-13 22:01 ` [PATCH v8.1 12/27] xsplice: Implement support for applying/reverting/replacing patches Konrad Rzeszutek Wilk
2016-04-19 6:27 ` Jan Beulich
2016-04-21 0:28 ` Konrad Rzeszutek Wilk
2016-04-21 6:44 ` Jan Beulich
2016-04-21 20:27 ` Konrad Rzeszutek Wilk
2016-04-22 7:44 ` Jan Beulich
2016-04-22 10:51 ` Konrad Rzeszutek Wilk
2016-04-22 17:26 ` Konrad Rzeszutek Wilk
2016-04-25 7:55 ` Jan Beulich
2016-04-13 22:01 ` [PATCH v8.1 13/27] x86/xen_hello_world.xsplice: Test payload for patching 'xen_extra_version' Konrad Rzeszutek Wilk
2016-04-19 17:40 ` Jan Beulich
2016-04-20 16:10 ` Konrad Rzeszutek Wilk
2016-04-20 17:06 ` Jan Beulich
2016-04-13 22:01 ` [PATCH v8.1 14/27] xsplice, symbols: Implement symbol name resolution on address Konrad Rzeszutek Wilk
2016-04-19 19:31 ` Jan Beulich
2016-04-20 12:55 ` Ross Lagerwall
2016-04-21 0:26 ` Konrad Rzeszutek Wilk
2016-04-21 6:46 ` Jan Beulich
[not found] ` <CACJDEmrucgYZpCDv3EAkDJUOtdcP9P2T=Vine1o2pzUmwJDY1w@mail.gmail.com>
[not found] ` <CACJDEmrzieYh6__MHJH_okoZPk+RA56PuQKv-oid0j1t1po1oQ@mail.gmail.com>
[not found] ` <CACJDEmrdi3sTZjGowkvGP67-_DH3+TLvArC8qZfArsyPb6fpuA@mail.gmail.com>
[not found] ` <CACJDEmrQ6onv-xqYOi3nekioCSASb4c1eZHJ-rzMxU3Wa7SXTQ@mail.gmail.com>
2016-04-21 13:56 ` Konrad Rzeszutek Wilk
2016-04-21 14:25 ` Jan Beulich
2016-04-22 7:17 ` Ross Lagerwall
2016-04-22 7:51 ` Jan Beulich
2016-04-22 8:45 ` Ross Lagerwall
2016-04-22 10:08 ` Jan Beulich
2016-04-22 10:28 ` Konrad Rzeszutek Wilk
2016-04-22 10:50 ` Jan Beulich
2016-04-22 11:08 ` Konrad Rzeszutek Wilk
2016-04-22 11:18 ` Jan Beulich
2016-04-24 21:41 ` Konrad Rzeszutek Wilk
2016-04-25 8:02 ` Jan Beulich
2016-04-22 11:13 ` Ross Lagerwall
2016-04-22 11:24 ` Jan Beulich
2016-04-22 21:10 ` Konrad Rzeszutek Wilk
2016-04-25 6:41 ` Ross Lagerwall
2016-04-25 8:15 ` Jan Beulich
2016-04-22 14:17 ` Konrad Rzeszutek Wilk
2016-04-13 22:01 ` [PATCH v8.1 15/27] xsplice, symbols: Implement fast symbol names -> virtual addresses lookup Konrad Rzeszutek Wilk
2016-04-19 19:52 ` Jan Beulich
2016-04-22 15:21 ` Konrad Rzeszutek Wilk
2016-04-25 8:38 ` Jan Beulich
2016-04-25 14:12 ` Konrad Rzeszutek Wilk
2016-04-13 22:01 ` [PATCH v8.1 16/27] x86, xsplice: Print payload's symbol name and payload name in backtraces Konrad Rzeszutek Wilk
2016-04-19 20:09 ` Jan Beulich
2016-04-13 22:01 ` [PATCH v8.1 17/27] xsplice: Add support for bug frames Konrad Rzeszutek Wilk
2016-04-19 20:17 ` Jan Beulich
2016-04-21 0:29 ` Konrad Rzeszutek Wilk
2016-04-21 6:49 ` Jan Beulich
2016-04-22 10:10 ` Konrad Rzeszutek Wilk
2016-04-22 10:28 ` Jan Beulich
2016-04-22 10:54 ` Konrad Rzeszutek Wilk
2016-04-22 10:58 ` Jan Beulich
2016-04-22 11:10 ` Konrad Rzeszutek Wilk
2016-04-13 22:01 ` [PATCH v8.1 18/27] xsplice: Add support for exception tables Konrad Rzeszutek Wilk
2016-04-19 20:31 ` Jan Beulich
2016-04-13 22:02 ` [PATCH v8.1 19/27] xsplice: Add support for alternatives Konrad Rzeszutek Wilk
2016-04-20 6:28 ` Jan Beulich
2016-04-21 0:30 ` Konrad Rzeszutek Wilk
2016-04-21 6:55 ` Jan Beulich
2016-04-21 0:31 ` Konrad Rzeszutek Wilk
2016-04-21 6:56 ` Jan Beulich
2016-04-22 16:06 ` Konrad Rzeszutek Wilk
2016-04-13 22:02 ` [PATCH v8.1 20/27] build_id: Provide ld-embedded build-ids Konrad Rzeszutek Wilk
2016-04-20 7:14 ` Jan Beulich
2016-04-21 0:33 ` Konrad Rzeszutek Wilk
2016-04-21 6:59 ` Jan Beulich
2016-04-21 20:30 ` Konrad Rzeszutek Wilk
2016-04-22 16:16 ` Konrad Rzeszutek Wilk
2016-04-13 22:02 ` [PATCH v8.1 21/27] xsplice: Print build_id in keyhandler and on bootup Konrad Rzeszutek Wilk
2016-04-13 22:02 ` [PATCH v8.1 22/27] XENVER_build_id/libxc: Provide ld-embedded build-id Konrad Rzeszutek Wilk
2016-04-14 15:03 ` Wei Liu
2016-04-14 15:04 ` Daniel De Graaf
2016-04-20 7:19 ` Jan Beulich
2016-04-13 22:02 ` [PATCH v8.1 23/27] libxl: info: Display build_id of the hypervisor Konrad Rzeszutek Wilk
2016-04-14 15:06 ` Wei Liu
2016-04-13 22:02 ` [PATCH v8.1 24/27] xsplice: Stacking build-id dependency checking Konrad Rzeszutek Wilk
2016-04-20 7:49 ` Jan Beulich
2016-04-22 10:46 ` Konrad Rzeszutek Wilk
2016-04-22 10:55 ` Jan Beulich
2016-04-13 22:02 ` [PATCH v8.1 25/27] xsplice/xen_replace_world: Test-case for XSPLICE_ACTION_REPLACE Konrad Rzeszutek Wilk
2016-04-20 11:12 ` Jan Beulich
2016-04-13 22:02 ` [PATCH v8.1 26/27] xsplice: Prevent duplicate payloads from being loaded Konrad Rzeszutek Wilk
2016-04-20 11:16 ` Jan Beulich
2016-04-13 22:02 ` [PATCH v8.1 27/27] MAINTAINERS/xsplice: Add myself and Ross as the maintainers Konrad Rzeszutek Wilk
2016-04-14 14:26 ` [PATCH v8.1] xSplice v1 design and implementation Konrad Rzeszutek Wilk
2016-04-14 14:29 ` Julien Grall
2016-04-14 15:12 ` Andrew Cooper
2016-04-14 15:17 ` Jan Beulich
2016-04-15 0:55 ` Konrad Rzeszutek Wilk
2016-04-17 8:00 ` Jan Beulich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160418055351.GA26968@localhost.localdomain \
--to=konrad.wilk@oracle.com \
--cc=andrew.cooper3@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=keir@xen.org \
--cc=mpohlack@amazon.com \
--cc=ross.lagerwall@citrix.com \
--cc=sasha.levin@oracle.com \
--cc=tim@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.