X-Git-Url: https://ruderich.org/simon/gitweb/?p=blhc%2Fblhc.git;a=blobdiff_plain;f=bin%2Fblhc;h=c8260e58dc55cc01f939361155d834a9b9a74679;hp=21681109a1bbf4d4f15823affa949aa32342f295;hb=b3737dbbbeaf60f8685e099043675712284e6fa6;hpb=11b760e9716cac5513dd0cf9267b8f4780b43b35 diff --git a/bin/blhc b/bin/blhc index 2168110..c8260e5 100755 --- a/bin/blhc +++ b/bin/blhc @@ -171,7 +171,12 @@ my @def_cxxflags = ( # @def_cxxflags_* is the same as @def_cflags_*. my @def_cppflags = (); my @def_cppflags_fortify = ( - '-D_FORTIFY_SOURCE=2', + '-D_FORTIFY_SOURCE=2', # must be first, see cppflags_fortify_broken() +); +my @def_cppflags_fortify_bad = ( + # These flags may overwrite -D_FORTIFY_SOURCE=2. + '-D_FORTIFY_SOURCE=0', + '-D_FORTIFY_SOURCE=1', ); my @def_ldflags = (); my @def_ldflags_relro = ( @@ -207,6 +212,7 @@ my @flag_refs = ( # References to all used flags. my @flag_refs_all = ( @flag_refs, + \@def_cppflags_fortify_bad, \@def_ldflags_pic, ); # Renaming rules for the output so the regex parts are not visible. Also @@ -325,6 +331,22 @@ sub all_flags_used { return 0; } +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. + + 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; + } + + return 0; +} + # Modifies $missing_flags_ref array. sub pic_pie_conflict { my ($line, $pie, $missing_flags_ref, @flags_pie) = @_; @@ -990,7 +1012,11 @@ LINE: } $exit |= $exit_code{flags_missing}; } - if ($preprocess and not all_flags_used($line, \@missing, @cppflags) + if ($preprocess + and (not all_flags_used($line, \@missing, @cppflags) + # The fortify flag might be overwritten, detect that. + or ($harden_fortify + and cppflags_fortify_broken($line, \@missing))) # Assume dpkg-buildflags returns the correct flags. and index($line, '`dpkg-buildflags --get CPPFLAGS`') == -1) { if (not $option_buildd) {