$file =~ m{/([a-zA-Z0-9._-]+)$};
$file = $1;
- if ($next_line =~ /\Q$file\E/ and $next_line =~ /$cc_regex/) {
+ if ($next_line =~ /\Q$file\E/ and $next_line =~ /$cc_regex/o) {
# We still have to skip the current line as it doesn't contain any
# compiler commands.
${$skip_ref} = 1;
}
# Ignore compiler warnings for now.
- next if $line =~ /$warning_regex/;
-
- # Remove all ANSI color sequences which are sometimes used in non-verbose
- # builds.
- $line = Term::ANSIColor::colorstrip($line);
- # Also strip '\0xf' (delete previous character), used by Elinks' build
- # system.
- $line =~ s/\x0f//g;
- # And "ESC(B" which seems to be used on armhf and hurd (not sure what it
- # does).
- $line =~ s/\033\(B//g;
+ next if $line =~ /$warning_regex/o;
+
+ if ($line =~ /\033/) { # esc
+ # Remove all ANSI color sequences which are sometimes used in
+ # non-verbose builds.
+ $line = Term::ANSIColor::colorstrip($line);
+ # Also strip '\0xf' (delete previous character), used by Elinks' build
+ # system.
+ $line =~ s/\x0f//g;
+ # And "ESC(B" which seems to be used on armhf and hurd (not sure what
+ # it does).
+ $line =~ s/\033\(B//g;
+ }
# Check if this line indicates a non verbose build.
my $non_verbose = is_non_verbose_build($line);
# line. parse_line() is slow, only use it when necessary.
my @line = (not $line =~ /;/)
? ($line)
- : Text::ParseWords::parse_line(';', 1, $line);
+ : map {
+ # Ensure newline at the line end - necessary for correct
+ # parsing later.
+ $_ =~ s/\s+$//;
+ $_ .= "\n";
+ } Text::ParseWords::parse_line(';', 1, $line);
foreach $line (@line) {
- # Add newline, drop all other whitespace at the end of a line.
- $line =~ s/\s+$//;
- $line .= "\n";
-
if ($continuation) {
$continuation = 0;
}
# Ignore lines with no compiler commands.
- next if $line !~ /\b$cc_regex(?:\s|\\)/ and not $non_verbose;
+ next if $line !~ /\b$cc_regex(?:\s|\\)/o and not $non_verbose;
# Ignore false positives.
#
(?:C|c)ompiler[\s.]*:?\s+
$cc_regex
(?:\s-std=[a-z0-9:+]+)?\s*$
- /x
- or $line =~ /^\s*(?:- )?(?:HOST_)?(?:CC|CXX)\s*=\s*$cc_regex\s*$/
+ /xo
+ or $line =~ /^\s*(?:- )?(?:HOST_)?(?:CC|CXX)\s*=\s*$cc_regex\s*$/o
or $line =~ /^\s*-- Check for working (?:C|CXX) compiler: /
or $line =~ /^\s*(?:echo )?Using [A-Z_]+\s*=\s*/;
# `make` output.
# Check the specified hardening options, same order as dpkg-buildflags.
if ($harden_pie) {
- @cflags = (@cflags, @cflags_pie);
+ @cflags = (@cflags, @cflags_pie);
@cxxflags = (@cxxflags, @cflags_pie);
- @ldflags = (@ldflags, @ldflags_pie);
+ @ldflags = (@ldflags, @ldflags_pie);
}
if ($harden_stack) {
- @cflags = (@cflags, @cflags_stack);
+ @cflags = (@cflags, @cflags_stack);
@cxxflags = (@cxxflags, @cflags_stack);
}
if ($harden_fortify) {
@cppflags = (@cppflags, @cppflags_fortify);
}
if ($harden_format) {
- @cflags = (@cflags, @cflags_format);
+ @cflags = (@cflags, @cflags_format);
@cxxflags = (@cxxflags, @cflags_format);
}
if ($harden_relro) {
# Remove everything until and including the compiler command. Makes checks
# easier and faster.
- $line =~ s/^.*?$cc_regex//;
+ $line =~ s/^.*?$cc_regex//o;
# Skip unnecessary tests when only preprocessing.
my $flag_preprocess = 0;
}
# Get all file extensions on this line.
- my @extensions = $line =~ /$file_extension_regex/g;
+ my @extensions = $line =~ /$file_extension_regex/go;
# Ignore all unknown extensions to speedup the search below.
@extensions = grep { exists $extension{$_} } @extensions;