X-Git-Url: https://ruderich.org/simon/gitweb/?p=blhc%2Fblhc.git;a=blobdiff_plain;f=bin%2Fblhc;h=72a2c4294ec2d6c04b1e54ff263a2452c2060e63;hp=38d0834cd4c1ddc37b70602cf0d186f64fc769ae;hb=9e0473a48cbaa821c36fb9c456c25b203d46c87c;hpb=e8c9cdc7a80e630245d179fd702de3c8beb12abb diff --git a/bin/blhc b/bin/blhc index 38d0834..72a2c42 100755 --- a/bin/blhc +++ b/bin/blhc @@ -48,6 +48,9 @@ my $cc_regex_normal = qr/ /x; # Regex to catch (GCC) compiler warnings. my $warning_regex = qr/^(.+?):(\d+):\d+: warning: (.+?) \[(.+?)\]$/; +# Regex to catch libtool commands and not lines which show commands executed +# by libtool (e.g. libtool: link: ...). +my $libtool_regex = qr/\blibtool\s.*--mode=/; # List of source file extensions which require preprocessing. my @source_preprocess_compile_cpp = ( @@ -429,6 +432,20 @@ sub pic_pie_conflict { sub is_non_verbose_build { my ($line, $next_line, $skip_ref) = @_; + if ($line =~ /$libtool_regex/o) { + # libtool's --silent hides the real compiler flags. + if ($line =~ /\s--silent/) { + return 1; + # If --silent is not present, skip this line as some compiler flags + # might be missing (e.g. -fPIE) which are handled correctly by libtool + # internally. libtool displays the real compiler command on the next + # line, so the flags are checked as usual. + } else { + ${$skip_ref} = 1; + return 0; + } + } + if (not (index($line, 'checking if you want to see long compiling messages... no') == 0 or $line =~ /^\s*\[?(?:CC|CCLD|C\+\+|CXX|CXXLD|LD|LINK)\]?\s+(.+?)$/ or $line =~ /^\s*[Cc]ompiling\s+(.+?)(?:\.\.\.)?$/ @@ -442,6 +459,8 @@ sub is_non_verbose_build { # C++ compiler setting. return 0 if $line =~ /^\s*C\+\+.+?:\s+(?:yes|no)\s*$/; return 0 if $line =~ /^\s*C\+\+ Library: stdc\+\+$/; + # "Compiling" non binary files. + return 0 if $line =~ /^\s*Compiling \S+\.(?:py|el)['"]?(?:\.\.\.)?$/; # "Compiling" with no file name. if ($line =~ /^\s*[Cc]ompiling\s+(.+?)(?:\.\.\.)?$/) { # $file_extension_regex may need spaces around the filename. @@ -688,8 +707,13 @@ foreach my $file (@ARGV) { # only, doesn't use the dpkg-buildpackage header. Necessary to ignore # build logs which aren't built (wrong architecture, build error, # etc.). - if (not $arch and index($line, 'Architecture: ') == 0) { - $arch = substr $line, 14, -1; # -1 to ignore '\n' at the end + if (not $arch) { + if (index($line, 'Build Architecture: ') == 0) { + $arch = substr $line, 20, -1; # -1 to ignore '\n' at the end + # For old logs (sbuild << 0.63.0-1). + } elsif (index($line, 'Architecture: ') == 0) { + $arch = substr $line, 14, -1; # -1 to ignore '\n' at the end + } } # dpkg-buildflags only provides hardening flags since 1.16.1, don't @@ -768,6 +792,7 @@ foreach my $file (@ARGV) { my $continuation = 0; my $complete_line = undef; + my $non_verbose; while (my $line = <$fh>) { # And stop at the end of the build log. Package details (reported by # the buildd logs) are not important for us. This also prevents false @@ -775,6 +800,10 @@ foreach my $file (@ARGV) { last if index($line, 'Build finished at ') == 0 and $line =~ /^Build finished at \d{8}-\d{4}$/; + if (not $continuation) { + $non_verbose = 0; + } + # Detect architecture automatically unless overridden. if (not $arch and index($line, 'dpkg-buildpackage: host architecture ') == 0) { @@ -804,7 +833,9 @@ foreach my $file (@ARGV) { } # Check if this line indicates a non verbose build. - my $non_verbose = is_non_verbose_build($line); + my $skip = 0; + $non_verbose |= is_non_verbose_build($line, undef, \$skip); + next if $skip; # One line may contain multiple commands (";"). Treat each one as # single line. parse_line() is slow, only use it when necessary. @@ -1262,14 +1293,18 @@ blhc is a small tool which checks build logs for missing hardening flags. It's licensed under the GPL 3 or later. It's designed to check build logs generated by Debian's dpkg-buildpackage (or -tools using dpkg-buildpackage like pbuilder or the official buildd build logs) -to help maintainers detect missing hardening flags in their packages. +tools using dpkg-buildpackage like pbuilder or sbuild (which is used for the +official buildd build logs)) to help maintainers detect missing hardening +flags in their packages. Only gcc is detected as compiler at the moment. If other compilers support hardening flags as well, please report them. If there's no output, no flags are missing and the build log is fine. +See F for details about performed checks, auto-detection and +limitations. + =head1 OPTIONS =over 8