my $option_version = 0;
my $option_all = 0;
my $option_arch = undef;
+my $option_buildd = 0;
if (not Getopt::Long::GetOptions(
'help|h|?' => \$option_help,
'version' => \$option_version,
'all' => \$option_all,
# Misc.
'arch' => \$option_arch,
+ 'buildd' => \$option_buildd,
)) {
require Pod::Usage;
Pod::Usage::pod2usage(2);
my $continuation = 0;
my $complete_line = undef;
while (my $line = <>) {
+ # dpkg-buildflags only provides hardening flags since 1.16.1, don't check
+ # for hardening flags in buildd mode if an older dpkg-dev is used. Default
+ # flags (-g -O2) are still checked.
+ #
+ # Packages which were built before 1.16.1 but used their own hardening
+ # flags are not checked.
+ if ($option_buildd and not $start
+ and $line =~ /^Toolchain package versions: /) {
+ require Dpkg::Version;
+ if ($line !~ /dpkg-dev_(\S+)/
+ or Dpkg::Version::version_compare($1, '1.16.1') < 0) {
+ $harden_format = 0;
+ $harden_fortify = 0;
+ $harden_stack = 0;
+ $harden_relro = 0;
+ $harden_bindnow = 0;
+ $harden_pie = 0;
+ }
+ }
+
# We skip over unimportant lines at the beginning to prevent false
# positives.
$start = 1 if $line =~ /^dpkg-buildpackage:/;
--bindnow force +bindbow check
--all force +all (+pie, +bindnow) check
--arch set architecture (autodetected)
+ --buildd parser mode for buildds
=head1 DESCRIPTION
disables hardening flags not available on this architecture. Is detected
automatically if dpkg-buildpackage is used.
+=item B<--buildd>
+
+Special mode for buildds when automatically parsing log files. The following
+changes are in effect:
+
+=over 2
+
+=item
+
+Don't check hardening flags in old log files (if dpkg-dev << 1.16.1 is
+detected).
+
+=back
+
=back
Auto detection for B<--pie> and B<--bindnow> only works if at least one
use strict;
use warnings;
-use Test::More tests => 80;
+use Test::More tests => 84;
sub is_blhc {
--bindnow force +bindbow check
--all force +all (+pie, +bindnow) check
--arch set architecture (autodetected)
+ --buildd parser mode for buildds
';
';
-# debian
-
-is_blhc 'debian', '', 8,
- 'CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -Wall -c test.c
-';
-
-
# c++
is_blhc 'c++', '--pie --bindnow', 8,
'CFLAGS missing (-Werror=format-security): gcc -D_FORTIFY_SOURCE=2 -g -O2 -Wformat -Wformat-security -Wall -c test.c
LDFLAGS missing (-Wl,-z,relro): gcc -Wl,-z,now -o test test.o
';
+
+
+# debian
+
+is_blhc 'debian', '', 8,
+ 'CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -Wall -c test.c
+';
+
+
+# buildd support
+
+is_blhc 'buildd-dpkg-dev', '--buildd', 8,
+ 'CFLAGS missing (-fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security): gcc -g -O2 -c test-a.c
+CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -g -O2 -c test-a.c
+CFLAGS missing (-fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security): gcc -g -O2 -c test-b.c
+CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -g -O2 -c test-b.c
+CFLAGS missing (-fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security): gcc -g -O2 -c test-c.c
+CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -g -O2 -c test-c.c
+LDFLAGS missing (-Wl,-z,relro): gcc -o test test-a.o test-b.o test-c.o -ltest
+CFLAGS missing (-O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security): gcc -g -c test-a.c
+CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -g -c test-a.c
+CFLAGS missing (-O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security): gcc -g -c test-b.c
+CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -g -c test-b.c
+CFLAGS missing (-O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security): gcc -g -c test-c.c
+CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -g -c test-c.c
+LDFLAGS missing (-Wl,-z,relro): gcc -o test test-a.o test-b.o test-c.o -ltest
+';
+
+is_blhc 'buildd-dpkg-dev-old', '--buildd', 8,
+ 'CFLAGS missing (-O2): gcc -g -c test-a.c
+CFLAGS missing (-O2): gcc -g -c test-b.c
+CFLAGS missing (-O2): gcc -g -c test-c.c
+';