Mark Wielaard df9a3ff
Upstream proposed patch.
Mark Wielaard df9a3ff
Note that this backport doesn't actually contain the new testcase.
Mark Wielaard df9a3ff
It is just the elf_getdata fix.
Mark Wielaard df9a3ff
Mark Wielaard df9a3ff
commit edff83d3416a136ce58a21a1244c99805e98f6d8
Mark Wielaard df9a3ff
Author: Mark Wielaard <mjw@redhat.com>
Mark Wielaard df9a3ff
Date:   Thu Feb 4 09:53:41 2016 +0100
Mark Wielaard df9a3ff
Mark Wielaard df9a3ff
    libelf: elf_getdata should not adjust alignment for SHT_NOBITS sections.
Mark Wielaard df9a3ff
    
Mark Wielaard df9a3ff
    In commit c0748e "libelf: More checking of valid sh_addralign values." we
Mark Wielaard df9a3ff
    adjusted bogus alignment of data buffers if they were greater than the
Mark Wielaard df9a3ff
    offset of the data in the file. This works OK, except when there is no
Mark Wielaard df9a3ff
    data in the file. So make sure to not adjust any NOBITS sections.
Mark Wielaard df9a3ff
    
Mark Wielaard df9a3ff
    Also adds a test that shows the issue and makes sure elflint is called
Mark Wielaard df9a3ff
    with --gnu in run-strip-test.sh.
Mark Wielaard df9a3ff
    
Mark Wielaard df9a3ff
    https://bugzilla.redhat.com/show_bug.cgi?id=1303845
Mark Wielaard df9a3ff
    
Mark Wielaard df9a3ff
    Signed-off-by: Mark Wielaard <mjw@redhat.com>
Mark Wielaard df9a3ff
Mark Wielaard df9a3ff
diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c
Mark Wielaard df9a3ff
index 4ec94b9..d1fafbf 100644
Mark Wielaard df9a3ff
--- a/libelf/elf_getdata.c
Mark Wielaard df9a3ff
+++ b/libelf/elf_getdata.c
Mark Wielaard df9a3ff
@@ -1,5 +1,5 @@
Mark Wielaard df9a3ff
 /* Return the next data element from the section after possibly converting it.
Mark Wielaard df9a3ff
-   Copyright (C) 1998-2005, 2006, 2007, 2015 Red Hat, Inc.
Mark Wielaard df9a3ff
+   Copyright (C) 1998-2005, 2006, 2007, 2015, 2016 Red Hat, Inc.
Mark Wielaard df9a3ff
    This file is part of elfutils.
Mark Wielaard df9a3ff
    Written by Ulrich Drepper <drepper@redhat.com>, 1998.
Mark Wielaard df9a3ff
 
Mark Wielaard df9a3ff
@@ -363,7 +363,7 @@ __libelf_set_rawdata_wrlock (Elf_Scn *scn)
Mark Wielaard df9a3ff
      at least an ehdr this will only trigger for alignment values > 64
Mark Wielaard df9a3ff
      which should be uncommon.  */
Mark Wielaard df9a3ff
   align = align ?: 1;
Mark Wielaard df9a3ff
-  if (align > offset)
Mark Wielaard df9a3ff
+  if (type != SHT_NOBITS && align > offset)
Mark Wielaard df9a3ff
     align = offset;
Mark Wielaard df9a3ff
   scn->rawdata.d.d_align = align;
Mark Wielaard df9a3ff
   if (elf->class == ELFCLASS32