From 7e9cb884492aec243337ffc8e4432a9ff2690956 Mon Sep 17 00:00:00 2001 From: Matthew Booth Date: Wed, 5 Aug 2009 14:55:54 +0100 Subject: [PATCH] Add a test for an executable stack in resultant binaries --- regressions/Makefile.am | 8 +++-- regressions/test-noexec-stack.pl | 64 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) create mode 100755 regressions/test-noexec-stack.pl diff --git a/regressions/Makefile.am b/regressions/Makefile.am index 12c4e80..a51c76b 100644 --- a/regressions/Makefile.am +++ b/regressions/Makefile.am @@ -24,10 +24,11 @@ TESTS = \ rhbz503169c10.sh \ rhbz503169c13.sh \ - test-cancellation-upload-daemoncancels.sh \ test-cancellation-download-librarycancels.sh \ - test-qemudie-midcommand.sh \ + test-cancellation-upload-daemoncancels.sh \ + test-noexec-stack.pl \ test-qemudie-killsub.sh \ + test-qemudie-midcommand.sh \ test-qemudie-synch.sh \ test-read_file.sh \ test-remote.sh \ @@ -41,7 +42,8 @@ FAILING_TESTS = \ TESTS_ENVIRONMENT = \ LD_LIBRARY_PATH=$(top_builddir)/src/.libs \ - LIBGUESTFS_PATH=$(top_builddir)/appliance + LIBGUESTFS_PATH=$(top_builddir)/appliance \ + NOEXEC_CHECK="$(top_builddir)/src/.libs/libguestfs.so $(top_builddir)/daemon/guestfsd" EXTRA_DIST = \ $(FAILING_TESTS) \ diff --git a/regressions/test-noexec-stack.pl b/regressions/test-noexec-stack.pl new file mode 100755 index 0000000..1a31fa7 --- /dev/null +++ b/regressions/test-noexec-stack.pl @@ -0,0 +1,64 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +die("NOEXEC_CHECK not set") unless(exists($ENV{NOEXEC_CHECK})); + +my @files = split(/ /, $ENV{NOEXEC_CHECK}); + +FILES: foreach my $file (@files) { + my $output; + my @cmd = ('readelf', '-l', $file); + open($output, '-|', @cmd) + or die("$0: failed to run: '".join(' ', @cmd)."': $!\n"); + + my $offset; + my $line = 1; + + # Find the offset of the Flags field + while(<$output>) { + next unless(/^\s*Type\b/); + + my @lines; + push(@lines, $_); + + # Look for a Flg field on this line (32 bit) + $offset = index($_, 'Flg '); + + if(-1 == $offset) { + # 64 bit is split over 2 lines. Look for a Flags field on the next + # line + $_ = <$output>; + $offset = index($_, 'Flags '); + $line = 2; + push(@lines, $_); + } + + die("Unrecognised header: ".join("\n", @lines)) if(-1 == $offset); + last; + } + + # Find the GNU_STACK entry + while(<$output>) { + next unless(/^\s*GNU_STACK\b/); + + # Skip over input lines according to the header + for(my $i = 1; $i < $line; $i++) { + $_ = <$output>; + } + + my $flags = substr($_, $offset, 3); + + $flags =~ /^[ R][ W]([ E])$/ or die("Unrecognised flags: $flags"); + + if('E' eq $1) { + print "***** $file has an executable stack *****\n"; + exit(1); + } + + next FILES; + } + + die("Didn't find GNU_STACK entry"); +} -- 1.8.3.1