From: Mark Wielaard Date: Wed, 5 Apr 2017 15:09:27 +0000 (+0200) Subject: elflint: Support checking ELF files with compressed sections. X-Git-Tag: elfutils-0.169~25 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=caf135b7f49f9f3499c952b352493cf561ae12bd;p=thirdparty%2Felfutils.git elflint: Support checking ELF files with compressed sections. Simply unconditionally uncompress any section to make sure indexes between sections check out. Add some testcases with various compressed sections. https://sourceware.org/bugzilla/show_bug.cgi?id=21332 Signed-off-by: Mark Wielaard --- diff --git a/src/ChangeLog b/src/ChangeLog index e022503b5..a1bec198d 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2017-04-05 Mark Wielaard + + * elflint.c (check_elf_header): Decompress all sections. + 2017-03-28 Mark Wielaard * elflint (check_group): Don't check if there is no flag word. diff --git a/src/elflint.c b/src/elflint.c index e0c65b6a5..51e53c23c 100644 --- a/src/elflint.c +++ b/src/elflint.c @@ -456,7 +456,9 @@ invalid number of section header table entries\n")); ERROR (gettext ("invalid section header index\n")); } - /* Check the shdrs actually exist. */ + /* Check the shdrs actually exist. And uncompress them before + further checking. Indexes between sections reference the + uncompressed data. */ unsigned int scnt; Elf_Scn *scn = NULL; for (scnt = 1; scnt < shnum; ++scnt) @@ -464,6 +466,9 @@ invalid number of section header table entries\n")); scn = elf_nextscn (ebl->elf, scn); if (scn == NULL) break; + /* If the section wasn't compressed this does nothing, but + returns an error. We don't care. */ + elf_compress (scn, 0, 0); } if (scnt < shnum) ERROR (gettext ("Can only check %u headers, shnum was %u\n"), scnt, shnum); diff --git a/tests/ChangeLog b/tests/ChangeLog index 3479cf072..5f7bcddbd 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,9 @@ +2017-04-05 Mark Wielaard + + * test-subr.sh (testrun_on_self_compressed): New function. + * run-elflint-self.sh: Call testrun_on_self_compressed. + * run-elflint-test.sh: Add testfile42z and testfile-s390x-hash-bothz. + 2017-03-30 Mark Wielaard * peel_type.c: New file. diff --git a/tests/run-elflint-self.sh b/tests/run-elflint-self.sh index 013109dbb..58fa7d0fb 100755 --- a/tests/run-elflint-self.sh +++ b/tests/run-elflint-self.sh @@ -1,5 +1,5 @@ #! /bin/sh -# Copyright (C) 2005, 2007 Red Hat, Inc. +# Copyright (C) 2005, 2007, 2017 Red Hat, Inc. # This file is part of elfutils. # Written by Ulrich Drepper , 2005. # @@ -19,3 +19,4 @@ . $srcdir/test-subr.sh testrun_on_self ${abs_top_builddir}/src/elflint --quiet --gnu-ld +testrun_on_self_compressed ${abs_top_builddir}/src/elflint --quiet --gnu-ld diff --git a/tests/run-elflint-test.sh b/tests/run-elflint-test.sh index f3bd9012c..caf172a61 100755 --- a/tests/run-elflint-test.sh +++ b/tests/run-elflint-test.sh @@ -33,6 +33,11 @@ testrun ${abs_top_builddir}/src/elflint -q testfile33 testfiles testfile42 testrun ${abs_top_builddir}/src/elflint -q --gnu-ld testfile42 +# Contains debuginfo, compress it, recheck +tempfiles testfile42z +testrun ${abs_top_builddir}/src/elfcompress -f -q -o testfile42z testfile42 +testrun ${abs_top_builddir}/src/elflint -q --gnu-ld testfile42z + testfiles testfile46 testrun ${abs_top_builddir}/src/elflint -q testfile46 @@ -47,4 +52,9 @@ testrun ${abs_top_builddir}/src/elflint -q --gnu-ld testlib_dynseg.so testfiles testfile-s390x-hash-both testrun ${abs_top_builddir}/src/elflint -q --gnu-ld testfile-s390x-hash-both +# Compress the symtab/strtab just because and recheck +tempfiles testfile-s390x-hash-bothz +testrun ${abs_top_builddir}/src/elfcompress -f -q --name='.s??tab' -o testfile-s390x-hash-bothz testfile-s390x-hash-both +testrun ${abs_top_builddir}/src/elflint -q --gnu-ld testfile-s390x-hash-bothz + exit 0 diff --git a/tests/test-subr.sh b/tests/test-subr.sh index f397aed1a..a765db639 100644 --- a/tests/test-subr.sh +++ b/tests/test-subr.sh @@ -1,5 +1,5 @@ #! /bin/sh -# Copyright (C) 2005-2015 Red Hat, Inc. +# Copyright (C) 2005-2015, 2017 Red Hat, Inc. # This file is part of elfutils. # # This file is free software; you can redistribute it and/or modify @@ -139,6 +139,24 @@ testrun_on_self() if test $exit_status != 0; then exit $exit_status; fi } +# Compress the files first. Compress both debug sections and symtab. +testrun_on_self_compressed() +{ + exit_status=0 + + for file in $self_test_files; do + tempfiles ${file}z + testrun ${abs_top_builddir}/src/elfcompress -f -q -o ${file}z ${file} + testrun ${abs_top_builddir}/src/elfcompress -f -q --name='.s??tab' ${file}z + + testrun $* ${file}z \ + || { echo "*** failure in $* ${file}z"; exit_status=1; } + done + + # Only exit if something failed + if test $exit_status != 0; then exit $exit_status; fi +} + # Same as above, but redirects stdout to /dev/null testrun_on_self_quiet() {