X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=bin%2Fblhc;h=d56a6c079eb9cd641961f87f13efc609dee4b29f;hb=a0449437d5ece8f14f3b450e91325e0e8a6765e7;hp=8297b7d6993c1465cb2795951fde8225752448c1;hpb=b21cfdd3e2339dee97950dfd8a88ddb274b3f674;p=blhc%2Fblhc.git diff --git a/bin/blhc b/bin/blhc index 8297b7d..d56a6c0 100755 --- a/bin/blhc +++ b/bin/blhc @@ -24,7 +24,7 @@ use warnings; use Getopt::Long (); use Text::ParseWords (); -our $VERSION = '0.07'; +our $VERSION = '0.08'; # CONSTANTS/VARIABLES @@ -427,21 +427,48 @@ sub all_flags_used { @{$missing_flags_ref} = @missing_flags; return 0; } +# Check if any of \@bad_flags occurs after $good_flag. Doesn't check if +# $good_flag is present. +sub flag_overwritten { + my ($line, $good_flag, $bad_flags) = @_; + + if (not any_flags_used($line, @{$bad_flags})) { + return 0; + } + + my $bad_pos = 0; + foreach my $flag (@{$bad_flags}) { + while ($line =~ /$flag/g) { + if ($bad_pos < $+[0]) { + $bad_pos = $+[0]; + } + } + } + my $good_pos = 0; + while ($line =~ /$good_flag/g) { + $good_pos = $+[0]; + } + if ($good_pos > $bad_pos) { + return 0; + } + return 1; +} sub cppflags_fortify_broken { my ($line, $missing_flags) = @_; - # This doesn't take the position into account, but is a simple solution. - # And if the build system tries to force -D_FORTIFY_SOURCE=0/1, something - # is wrong anyway. + # $def_cppflags_fortify[0] must be -D_FORTIFY_SOURCE=2! + my $fortify_source = $def_cppflags_fortify[0]; - if (any_flags_used($line, @def_cppflags_fortify_bad)) { - # $def_cppflags_fortify[0] must be -D_FORTIFY_SOURCE=2! - push @{$missing_flags}, $def_cppflags_fortify[0]; - return 1; + # Some build systems enable/disable fortify source multiple times, check + # the final result. + if (not flag_overwritten($line, + $fortify_source, + \@def_cppflags_fortify_bad)) { + return 0; } - - return 0; + push @{$missing_flags}, $fortify_source; + return 1; } # Modifies $missing_flags_ref array.