[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8.1 10/27] xsplice: Add helper elf routines
>>> Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> 04/20/16 6:09 PM >>> >On Mon, Apr 18, 2016 at 12:23:26AM -0600, Jan Beulich wrote: >> >>> Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> 04/18/16 7:55 AM >>> >> >> >+ 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. >> >> Exactly. Yet what do you do above? >> >> >> section header alone. >> > >> >I modify sec[i].sec->sh_entsize in calc_section >> >> See the comment there (in the next patch it was, I think). > >OK, and re-reading above you say "imo cast away constness just there." >so you are OK then with functions casting away constness if they >need to modify the structure. If it's really just one exceptional place where this happens, I guess it's okay as, well, an exception. Otherwise the const would need to be dropped wherever necessary to avoid having to cast it away in certain places. >> >> >+ 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; >> >> As said, I'd suggest making this even more strict by checking at least >> against >> the ELF header size. > >I am not sure I understand you. Initially I thought you mean the >p_filesz (which is the program header) - but this ELF file is not a >program - it is an relocatable object so there are no program header. Right, and I indeed mean the ELF header: The section headers clearly can't start inside it. >Ah, I think I mislead you! (with the 'if (!delta)..')The code will have: >if ( !delta ) >return -EINVAL; >if ( delta + sec[i].sec->sh_size > elf->len ) >return -EINVAL; That's what I had understood, and the first if() is which I'd like to see made slightly more strict. >> >> >+ 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. >> >> I don't think so - there's no overflow being checked for here at all, this is >> just a within bounds check. Just compare with the other one. > >So earlier (in common/xsplice, verify_payload) there was a check on the >size of the payload (up to 2MB), hence my check here would catch the >overflow violation ((-1U) > 2(MB), but it is not very clear. > >I modified this above to be: > >303 if ( elf->hdr->e_shoff > ULONG_MAX - elf->hdr->e_shoff ) > Something's clearly wrong here, with e_shoff used on both sides. >304 { > >305 dprintk(XENLOG_ERR, XSPLICE "%s: Bogus e_shoff!\n", elf->name); > >306 return -EINVAL; > >307 } > >308 > >I can also add back the elf->hdr->e_shoff > elf->len in this >conditional if you would like (along with the comment about 2(MB)) It's not because I like it, but for consistency with all the other elf->len checks. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |