| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 15/21] libelf: check loops for running away
 George Dunlap writes ("Re: [Xen-devel] [PATCH 15/21] libelf: check loops for 
running away"):
> On Wed, Jun 12, 2013 at 5:00 PM, Ian Jackson <ian.jackson@xxxxxxxxxxxxx> 
> wrote:
> > +        /*
> > +         * This test also arranges for the loop to terminate if the
> > +         * input file has a ridiculous value for the header count: The
> > +         * first putative header outside the input image will appear
> > +         * to have type 0 (since out-of-range accesses read as 0) and
> > +         * PT_NOTE != 0.
> > +         */
> >          if ( elf_uval(elf, phdr, p_type) != PT_NOTE )
> >              continue;
> 
> Sorry, run that by me again?  It looks like it will call "continue" in
> that case, not "break".
> 
> This looks inconsistent with the changes you made in libelf-loader.c
> and xc_dom_elfloader.c: There we have similar types of reads with
> continues, but you do an access check anyway.
> 
> Is there something special about phdr vs shdr?
You are entirely correct.  I must have misread "continue" as "break".
> > +            /*
> > +             * See above re guarantee of loop termination.
> > +             * SHT_NOTE != 0.
> > +             */
> >              if ( elf_uval(elf, shdr, sh_type) != SHT_NOTE )
> >                  continue;
> 
> Same as above.
Again.
I will fix these by changing them to use the same checks as elsewhere.
> > @@ -306,7 +323,14 @@ ELF_HANDLE_DECL(elf_note) elf_note_next(struct 
> > elf_binary *elf, ELF_HANDLE_DECL(
> >      unsigned namesz = (elf_uval(elf, note, namesz) + 3) & ~3;
> >      unsigned descsz = (elf_uval(elf, note, descsz) + 3) & ~3;
> >
> > -    return ELF_MAKE_HANDLE(elf_note, ELF_HANDLE_PTRVAL(note) + 
> > elf_size(elf, note) + namesz + descsz);
> > +    elf_ptrval ptrval = ELF_HANDLE_PTRVAL(note)
> > +        + elf_size(elf, note) + namesz + descsz;
> > +
> > +    if ( ( ptrval <= ELF_HANDLE_PTRVAL(note) || /* wrapped or stuck */
> > +           !elf_access_ok(elf, ELF_HANDLE_PTRVAL(note), 1) ) )
> > +        ptrval = ELF_MAX_PTRVAL; /* terminate caller's loop */
> 
> Is this an official part of the interface, or do you just "know" that
> the two callers will happen to break out of their loop when this
> happens?
> 
> If it's the second, this seems like a future bug waiting to happen...
I will add a comment, making it part of the declared interface.
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
 
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |