[hardening-discuss] Bug#688522: hardening-includes: hardening-check - please consider invoking readelf fewer times

Niels Thykier niels at thykier.net
Sun Sep 23 13:25:36 UTC 2012


Package: hardening-includes
Version: 2.2
Severity: wishlist

Hi,

Currently hardening-check invokes readelf 3 times per ELF file.  It is
my understanding that forking is significantly more expensive on
kFreeBSD based platforms.  Please consider reducing it to at most once
per file.

It is possible to reduce the number of readelf calls even more by
using (e.g.) xargs, though it is hardly trivial.  If you need
inspiration for this case, consider looking at
collection/object-dump{,-helper} in Lintian.

Below sample ad-hoc patch I used for testing.  It seems to work ok,
but not tested a lot and has a couple of "style" issues...  :)

~Niels

$ diff -u /usr/bin/hardening-check hardening-check-forkless
--- /usr/bin/hardening-check    2012-06-14 16:41:46.000000000 +0000
+++ hardening-check-forkless    2012-09-23 13:00:09.000000000 +0000
@@ -200,14 +200,15 @@
     return $1 || "";
 }
 
-sub find_functions($$) {
-    my ($file, $undefined) = @_;
+sub find_functions($$;$) {
+    my ($file, $undefined, $relocs) = @_;
     my (%funcs);
 
     # Catch "NOTYPE" for object archives.
     my $func_regex = " (I?FUNC|NOTYPE) ";
 
-    my $relocs = output("readelf", "-sW", $file);
+    $relocs = output("readelf", "-sW", $file)
+       unless defined $relocs;
     for my $line (split("\n", $relocs)) {
         next if ($line !~ /$func_regex/);
         next if ($undefined && $line !~ /$func_regex.* UND /);
@@ -247,17 +248,18 @@
     @tags = ();
 
     # Get program headers.
-    my $PROG_REPORT=output("readelf", "-lW", $file);
+    my $PROG_REPORT=output("readelf", "-lsdW", $file);
     if (length($PROG_REPORT) == 0) {
         $overall = 1;
         next;
     }
 
     # Get ELF headers.
-    my $DYN_REPORT=output("readelf", "-dW", $file);
+#    my $DYN_REPORT=output("readelf", "-dW", $file);
+    my $DYN_REPORT=$PROG_REPORT;
 
     # Get list of all symbols needing external resolution.
-    my $functions = find_functions($file, 1);
+    my $functions = find_functions($file, 1, $PROG_REPORT);
 
     # PIE
     # First, verify this is an executable, not a library. This seems to be



More information about the hardening-discuss mailing list