]> ruderich.org/simon Gitweb - blhc/blhc.git/commitdiff
Ignore missing -Wformat -Werror=format-security for Ada files.
authorSimon Ruderich <simon@ruderich.org>
Sat, 7 Jul 2012 17:27:04 +0000 (19:27 +0200)
committerSimon Ruderich <simon@ruderich.org>
Sat, 7 Jul 2012 17:29:57 +0000 (19:29 +0200)
Thanks to Nicolas Boulenguez for reporting this. See
http://bugs.debian.org/680117 for details.

MANIFEST
bin/blhc
t/logs/ada [new file with mode: 0644]
t/tests.t

index 1ef6dac86bed0663b857f11fbc692c4789c4c065..adebaab4e2cee1ae5fc7e1b0791d9e64d886982b 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -6,6 +6,7 @@ META.json
 META.yml
 NEWS
 README
 META.yml
 NEWS
 README
+t/logs/ada
 t/logs/arch-amd64
 t/logs/arch-avr32
 t/logs/arch-i386
 t/logs/arch-amd64
 t/logs/arch-avr32
 t/logs/arch-i386
index 75888b86835469f3de4aa00898670084893f8801..e03ac2889aa039ed04eaad66720dec1ac73fab18 100755 (executable)
--- a/bin/blhc
+++ b/bin/blhc
@@ -81,6 +81,12 @@ my @source_no_preprocess_compile_cpp = (
     # Objective-C++
     qw( mii ),
 );
     # Objective-C++
     qw( mii ),
 );
+my @source_no_preprocess_compile_ada = (
+    # Ada body
+    qw( adb ),
+    # If you add another file, fix use of @source_no_preprocess_compile_ada
+    # below (search for $compile_ada).
+);
 my @source_no_preprocess_compile = (
     # C
     qw( i ),
 my @source_no_preprocess_compile = (
     # C
     qw( i ),
@@ -90,8 +96,8 @@ my @source_no_preprocess_compile = (
     qw( mi ),
     # Fortran
     qw( f for ftn f90 f95 f03 f08 ),
     qw( mi ),
     # Fortran
     qw( f for ftn f90 f95 f03 f08 ),
-    # Ada body
-    qw( adb ),
+    # Ada
+    @source_no_preprocess_compile_ada,
 );
 my @source_no_preprocess_no_compile = (
     # Assembly
 );
 my @source_no_preprocess_no_compile = (
     # Assembly
@@ -287,6 +293,20 @@ my $option_color;
 
 # FUNCTIONS
 
 
 # FUNCTIONS
 
+# Only works for single-level arrays with no undef values. Thanks to perlfaq4.
+sub array_equal {
+    my ($first_ref, $second_ref) = @_;
+
+    return 0 if scalar @{$first_ref} != scalar @{$second_ref};
+
+    my $length = scalar @{$first_ref};
+    for (my $i = 0; $i < $length; $i++) {
+        return 0 if $first_ref->[$i] ne $second_ref->[$i];
+    }
+
+    return 1;
+}
+
 sub error_flags {
     my ($message, $missing_flags_ref, $flag_renames_ref, $line) = @_;
 
 sub error_flags {
     my ($message, $missing_flags_ref, $flag_renames_ref, $line) = @_;
 
@@ -640,6 +660,11 @@ foreach my $file (@ARGV) {
     my $harden_bindnow = $option_bindnow; # defaults to 0
     my $harden_pie     = $option_pie;     # defaults to 0
 
     my $harden_bindnow = $option_bindnow; # defaults to 0
     my $harden_pie     = $option_pie;     # defaults to 0
 
+    # Does this build log use ada? Ada also uses gcc as compiler but uses
+    # different CFLAGS. But only perform ada checks if an ada compiler used
+    # for performance reasons.
+    my $ada = 0;
+
     while (my $line = <$fh>) {
         # Detect architecture automatically unless overridden. For buildd logs
         # only, doesn't use the dpkg-buildpackage header. Necessary to ignore
     while (my $line = <$fh>) {
         # Detect architecture automatically unless overridden. For buildd logs
         # only, doesn't use the dpkg-buildpackage header. Necessary to ignore
@@ -699,6 +724,11 @@ foreach my $file (@ARGV) {
                 }
                 next FILE;
             }
                 }
                 next FILE;
             }
+
+            # Ada compiler.
+            if ($line =~ /\bgnat\b/) {
+                $ada = 1;
+            }
         }
 
         # We skip over unimportant lines at the beginning of the log to
         }
 
         # We skip over unimportant lines at the beginning of the log to
@@ -905,6 +935,22 @@ foreach my $file (@ARGV) {
         @ldflags = (@ldflags, @def_ldflags_bindnow);
     }
 
         @ldflags = (@ldflags, @def_ldflags_bindnow);
     }
 
+    # Stores normal CFLAGS when @cflags_ada are temporarily used.
+    my @cflags_backup;
+    # Ada CFLAGS.
+    my @cflags_ada = @cflags;
+    # Ada doesn't support format hardening flags, see #680117 for more
+    # information. Filter them out if ada is used.
+    if ($ada and $harden_format) {
+        @cflags_ada = grep {
+            my $ok = 1;
+            foreach my $flag (@def_cflags_format) {
+                $ok = 0 if $_ eq $flag;
+            }
+            $ok;
+        } @cflags;
+    }
+
     # Hack to fix cppflags_fortify_broken() if --ignore-flag
     # -D_FORTIFY_SOURCE=2 is used to ignore missing fortification. Only works
     # as long as @def_cppflags_fortify contains only one variable.
     # Hack to fix cppflags_fortify_broken() if --ignore-flag
     # -D_FORTIFY_SOURCE=2 is used to ignore missing fortification. Only works
     # as long as @def_cppflags_fortify contains only one variable.
@@ -1029,13 +1075,22 @@ LINE:
             }
         }
 
             }
         }
 
+        my $compile_cpp = 0;
+        my $compile_ada = 0;
         # Assume CXXFLAGS are required when a C++ file is specified in the
         # compiler line.
         # Assume CXXFLAGS are required when a C++ file is specified in the
         # compiler line.
-        my $compile_cpp = 0;
         if ($compile
                 and extension_found(\%extensions_compile_cpp, @extensions)) {
             $compile     = 0;
             $compile_cpp = 1;
         if ($compile
                 and extension_found(\%extensions_compile_cpp, @extensions)) {
             $compile     = 0;
             $compile_cpp = 1;
+        # Ada needs special CFLAGS, use them if only ada files are compiled.
+        } elsif ($ada
+                    and $compile
+                    and array_equal(\@extensions,
+                                    \@source_no_preprocess_compile_ada)) {
+            $compile_ada = 1;
+            @cflags_backup = @cflags;
+            @cflags        = @cflags_ada;
         }
 
         if ($option_buildd) {
         }
 
         if ($option_buildd) {
@@ -1100,6 +1155,11 @@ LINE:
                 $statistics{link_missing}++;
             }
         }
                 $statistics{link_missing}++;
             }
         }
+
+        # Restore normal CFLAGS.
+        if ($compile_ada) {
+            @cflags = @cflags_backup;
+        }
     }
 }
 
     }
 }
 
diff --git a/t/logs/ada b/t/logs/ada
new file mode 100644 (file)
index 0000000..bc801c2
--- /dev/null
@@ -0,0 +1,16 @@
+Build-Depends: ..., gnat, gnat-4.6, ...
+
+dpkg-buildpackage: source package ada package
+
+
+gcc-4.6 -c -fPIC -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security test.c
+gcc-4.6 -c -fPIC -g -O2 -fstack-protector --param=ssp-buffer-size=4 -gnatn -gnatw.eH test-a.adb
+gcc-4.6 -c -fPIC -g -O2 -fstack-protector --param=ssp-buffer-size=4 -gnatn -gnatw.eH test-b.adb
+gcc-4.6 -c -fPIC -g -O2 -fstack-protector --param=ssp-buffer-size=4 -gnatn -gnatw.eH test-c.adb
+gcc-4.6 -c -fPIC -g -O2 -fstack-protector --param=ssp-buffer-size=4 -gnatn -gnatw.eH test-d.ads
+
+/usr/bin/gcc-4.6 -shared -lgnat-4.6 -o libtest.so.2 test-a.o test-b.o test-c.o -Wl,-z,relro -Wl,--as-needed
+/usr/bin/gcc-4.6 -shared -lgnat-4.6 -o libtest.so.2 test-a.o test-b.o test-c.o -Wl,--as-needed
+
+gcc -c -g -O2 test.c
+gcc -g -O2 test.c
index 0811ef7bd8643157f7bf90726371cec1e66bdf54..0e1833e34e040139082360a3939fb9ca406b8209 100644 (file)
--- a/t/tests.t
+++ b/t/tests.t
@@ -19,7 +19,7 @@
 use strict;
 use warnings;
 
 use strict;
 use warnings;
 
-use Test::More tests => 194;
+use Test::More tests => 196;
 
 
 sub is_blhc {
 
 
 sub is_blhc {
@@ -748,6 +748,19 @@ LDFLAGS missing (-fPIE -pie -Wl,-z,relro -Wl,-z,now): g++-4.6 -Wl,-z,defs -o tes
 ';
 
 
 ';
 
 
+# ada
+
+is_blhc 'ada', '', 8,
+        'CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc-4.6 -c -fPIC -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security test.c
+LDFLAGS missing (-Wl,-z,relro): /usr/bin/gcc-4.6 -shared -lgnat-4.6 -o libtest.so.2 test-a.o test-b.o test-c.o -Wl,--as-needed
+CFLAGS missing (-fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security): gcc -c -g -O2 test.c
+CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -c -g -O2 test.c
+CFLAGS missing (-fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security): gcc -g -O2 test.c
+CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -g -O2 test.c
+LDFLAGS missing (-Wl,-z,relro): gcc -g -O2 test.c
+';
+
+
 # libtool
 
 is_blhc 'libtool', '--bindnow', 8,
 # libtool
 
 is_blhc 'libtool', '--bindnow', 8,