2 # Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
4 # Licensed under the Apache License 2.0 (the "License"). You may not use
5 # this file except in compliance with the License. You can obtain a copy
6 # in the file LICENSE in the source distribution or at
7 # https://www.openssl.org/source/license.html
10 no strict 'refs'; # To be able to use strings as function refs
12 use OpenSSL::Test::Utils;
14 use POSIX qw(strerror);
16 # We actually have space for up to 4095 error messages,
17 # numerically speaking... but we're currently only using
18 # numbers 1 through 127.
19 # This constant should correspond to the same constant
20 # defined in crypto/err/err.c, or at least must not be
21 # assigned a greater number.
22 use constant NUM_SYS_STR_REASONS => 127;
26 # In a cross compiled situation, there are chances that our
27 # application is linked against different C libraries than
28 # perl, and may thereby get different error messages for the
30 # The safest is not to test under such circumstances.
31 plan skip_all => 'This is unsupported for cross compiled configurations'
32 if config('CROSS_COMPILE');
34 # The same can be said when compiling OpenSSL with mingw configuration
35 # on Windows when built with msys perl. Similar problems are also observed
36 # in MSVC builds, depending on the perl implementation used.
37 plan skip_all => 'This is unsupported on MSYS/MinGW or MSWin32'
38 if $^O eq 'msys' or $^O eq 'MSWin32';
40 plan skip_all => 'OpenSSL is configured "no-autoerrinit" or "no-err"'
41 if disabled('autoerrinit') || disabled('err');
43 # These are POSIX error names, which Errno implements as functions
44 # (this is documented)
45 my @posix_errors = @{$Errno::EXPORT_TAGS{POSIX}};
47 if ($^O eq 'MSWin32') {
48 # On Windows, these errors have been observed to not always be loaded by
49 # apps/openssl, while they are in perl, which causes a difference that we
50 # consider a false alarm. So we skip checking these errors.
51 # Because we can't know exactly what symbols exist in a perticular perl
52 # version, we resort to discovering them directly in the Errno package
54 my @error_skiplist = qw(
79 exists $Errno::{$_} && $x == $Errno::{$_}
84 plan tests => scalar @posix_errors
85 +1 # Checking that error 128 gives 'reason(128)'
86 +1 # Checking that error 0 gives the library name
89 foreach my $errname (@posix_errors) {
90 my $errnum = "Errno::$errname"->();
93 skip "Error $errname ($errnum) isn't within our range", 1
94 if $errnum > NUM_SYS_STR_REASONS;
97 # Set $! to the error number...
99 # ... and $! will give you the error string back
103 # We know that the system reasons are in OpenSSL error library 2
104 my @oerr = run(app([ qw(openssl errstr), sprintf("2%06x", $errnum) ]),
107 @oerr = split_error($oerr[0]);
108 ok($oerr[3] eq $perr, "($errnum) '$oerr[3]' == '$perr'");
112 my @after = run(app([ qw(openssl errstr 2000080) ]), capture => 1);
113 $after[0] =~ s|\R$||;
114 @after = split_error($after[0]);
115 ok($after[3] eq "reason(128)", "(128) '$after[3]' == 'reason(128)'");
117 my @zero = run(app([ qw(openssl errstr 2000000) ]), capture => 1);
119 @zero = split_error($zero[0]);
120 ok($zero[3] eq "system library", "(0) '$zero[3]' == 'system library'");
122 # For an error string "error:xxxxxxxx:lib:func:reason", this returns
123 # the following array:
125 # ( "xxxxxxxx", "lib", "func", "reason" )
127 # Limit to 5 items, in case the reason contains a colon
128 my @erritems = split /:/, $_[0], 5;
130 # Remove the first item, which is always "error"