On 03/07/16 at 03:30pm, Kees Cook wrote: > On Fri, Mar 4, 2016 at 8:25 AM, Baoquan He <b...@redhat.com> wrote: > > When process 32 bit relocation tables a local variable 'extended' > > is defined to calculate the physical address of relocs entry. > > However its type is 'int' which is enough for i386, but not enough > > for x86_64. That's why relocation can only be handled under 2G. > > Otherwise a overflow will happen and cause system hang. > > > > Here change it to 'long' as 32 bit inverse relocation processing > > does, and this change is safe for i386 relocation handling. > > > > Signed-off-by: Baoquan He <b...@redhat.com> > > Acked-by: Kees Cook <keesc...@chromium.org> > > This patch should probably be moved up into the start of this series > instead of living in the middle here, since it's a clear stand-alone > bug fix.
Of course. Will put it in the start of this series. Thanks. > > -Kees > > > --- > > arch/x86/boot/compressed/misc.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/arch/x86/boot/compressed/misc.c > > b/arch/x86/boot/compressed/misc.c > > index 4b2cd0c..70445c3 100644 > > --- a/arch/x86/boot/compressed/misc.c > > +++ b/arch/x86/boot/compressed/misc.c > > @@ -298,7 +298,7 @@ static void handle_relocations(void *output, unsigned > > long output_len) > > * So we work backwards from the end of the decompressed image. > > */ > > for (reloc = output + output_len - sizeof(*reloc); *reloc; reloc--) > > { > > - int extended = *reloc; > > + long extended = *reloc; > > extended += map; > > > > ptr = (unsigned long)extended; > > -- > > 2.5.0 > > > > > > -- > Kees Cook > Chrome OS & Brillo Security