Make OpenSSL::Test::run() sensitive to signals
authorRichard Levitte <levitte@openssl.org>
Fri, 18 Mar 2016 07:57:52 +0000 (08:57 +0100)
committerRichard Levitte <levitte@openssl.org>
Fri, 18 Mar 2016 14:25:23 +0000 (15:25 +0100)
$? in perl gets the status value from wait(2), which is a word with
the exit code in the upper half and the number of a raised signal in
the lower half.  OpenSSL::Test::run() ignored the signal half up until
now.

With this change, we recalculate an exit code the same way the Unix
shells do, using this formula:

    ($? & 0x7f) ? ($? & 0x7f)|0x80 : ($? >> 8);

Reviewed-by: Rich Salz <rsalz@openssl.org>
Reviewed-by: Emilia Käsper <emilia@openssl.org>
test/testlib/OpenSSL/Test.pm

index ecac93f..2b0c050 100644 (file)
@@ -324,12 +324,17 @@ sub run {
     my @r = ();
     my $r = 0;
     my $e = 0;
     my @r = ();
     my $r = 0;
     my $e = 0;
+
+    # The dance we do with $? is the same dance the Unix shells appear to
+    # do.  For example, a program that gets aborted (and therefore signals
+    # SIGABRT = 6) will appear to exit with the code 134.  We mimic this
+    # to make it easier to compare with a manual run of the command.
     if ($opts{capture}) {
        @r = `$prefix$cmd`;
     if ($opts{capture}) {
        @r = `$prefix$cmd`;
-       $e = $? >> 8;
+       $e = ($? & 0x7f) ? ($? & 0x7f)|0x80 : ($? >> 8);
     } else {
        system("$prefix$cmd");
     } else {
        system("$prefix$cmd");
-       $e = $? >> 8;
+       $e = ($? & 0x7f) ? ($? & 0x7f)|0x80 : ($? >> 8);
        $r = $hooks{exit_checker}->($e);
     }
 
        $r = $hooks{exit_checker}->($e);
     }