This is an automated email from the git hooks/post-receive script.

nthykier pushed a commit to branch master
in repository lintian.

commit db4f3041e20ebcb4f454f3a3e10331464c34b7a8
Author: Niels Thykier <ni...@thykier.net>
Date:   Sat Sep 17 19:43:16 2016 +0000

    c/binaries: Implement hardening-no-bindnow directly
    
    Signed-off-by: Niels Thykier <ni...@thykier.net>
---
 checks/binaries.pm               |  7 ++++++-
 helpers/coll/objdump-info-helper | 10 ++++++++++
 lib/Lintian/Collect/Binary.pm    |  6 +++++-
 3 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/checks/binaries.pm b/checks/binaries.pm
index 5497660..e9d1d5d 100644
--- a/checks/binaries.pm
+++ b/checks/binaries.pm
@@ -560,6 +560,11 @@ sub run {
                 tag 'hardening-no-relro', $file;
             }
 
+            if ($arch_hardening->{'hardening-no-bindnow'}
+                and not exists($objdump->{'FLAGS_1'}{'NOW'})) {
+                tag 'hardening-no-bindnow', $file;
+            }
+
             # Check for missing hardening characteristics. This currently
             # handles the following checks:
             # no-relro no-fortify-functions no-stackprotector no-bindnow no-pie
@@ -568,7 +573,7 @@ sub run {
                     foreach my $t (@{$info->hardening_info->{$fname}}) {
                         my $tag = "hardening-$t";
                         # Implemented elsewhere
-                        next if $t eq 'no-relro';
+                        next if $t eq 'no-relro' or $t eq 'no-bindnow';
                         # Binaries built by the Go compiler do not support all
                         # hardening measures.
                         next
diff --git a/helpers/coll/objdump-info-helper b/helpers/coll/objdump-info-helper
index c7199b1..4f8a24a 100755
--- a/helpers/coll/objdump-info-helper
+++ b/helpers/coll/objdump-info-helper
@@ -172,6 +172,16 @@ while (my $line = <$readelf>) {
             $keep = 1;
         } elsif ($type eq 'TEXTREL') {
             $keep = 1;
+        } elsif ($type eq 'FLAGS_1') {
+            # Will contain "NOW" if the binary was built with -Wl,-z,now
+            $keep = 1;
+            $value =~ s/^Flags:\s*//i;
+        } elsif (($type eq 'FLAGS' and $value =~ m/\bBIND_NOW\b/)
+            or $type eq 'BIND_NOW') {
+            # Variants of bindnow
+            $type = 'FLAGS_1';
+            $value = 'NOW';
+            $keep = 1;
         }
         $keep = 1
           if $value =~ s/^(?:Shared library|Library soname): \[(.*)\]/$1/;
diff --git a/lib/Lintian/Collect/Binary.pm b/lib/Lintian/Collect/Binary.pm
index 93d727e..50aba9d 100644
--- a/lib/Lintian/Collect/Binary.pm
+++ b/lib/Lintian/Collect/Binary.pm
@@ -415,7 +415,7 @@ sub objdump_info {
         foreach my $data (split m/\s*\n\s*/, $pg->{'dynamic-section'}//'') {
             next unless $data;
             # Here we just need RPATH and NEEDS, so ignore the rest for now
-            my ($header, $val) = split m/\s++/, $data;
+            my ($header, $val) = split(m/\s++/, $data, 2);
             if ($header eq 'RPATH') {
                 # RPATH is like PATH
                 foreach my $rpathcomponent (split(m/:/,$val)) {
@@ -425,6 +425,10 @@ sub objdump_info {
                 push @{ $info{$header} }, $val;
             } elsif ($header eq 'TEXTREL') {
                 $info{$header} = 1;
+            } elsif ($header eq 'FLAGS_1') {
+                for my $flag (split(m/\s++/, $val)) {
+                    $info{$header}{$flag} = 1;
+                }
             }
         }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/lintian/lintian.git

Reply via email to