summaryrefslogtreecommitdiff
path: root/util/mkerr.pl
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2020-11-12 09:21:05 +0100
committerRichard Levitte <levitte@openssl.org>2021-02-05 14:09:16 +0100
commitb14c8465c0899c3c2b2acc3d01472941de4c318e (patch)
tree7b2f5fab582ca0970ad4d0aedb63f09786eb9b8b /util/mkerr.pl
parentbbde8566191e5851f4418cbb8acb0d50b16170d8 (diff)
downloadopenssl-new-b14c8465c0899c3c2b2acc3d01472941de4c318e.tar.gz
ERR: clean away everything related to _F_ macros from util/mkerr.pl
Instead, we preserve all the pre-3.0 _F_ macros in the backward compatibility headers include/openssl/cryptoerr_legacy.h and include/openssl/sslerr_legacy.h Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/13392)
Diffstat (limited to 'util/mkerr.pl')
-rwxr-xr-xutil/mkerr.pl222
1 files changed, 10 insertions, 212 deletions
diff --git a/util/mkerr.pl b/util/mkerr.pl
index d7c72af14c..7d912477b8 100755
--- a/util/mkerr.pl
+++ b/util/mkerr.pl
@@ -125,24 +125,17 @@ if ( $internal ) {
}
# Data parsed out of the config and state files.
-# We always map function-code values to zero, so items marked below with
-# an asterisk could eventually be removed. TODO(4.0)
my %hpubinc; # lib -> public header
my %libpubinc; # public header -> lib
my %hprivinc; # lib -> private header
my %libprivinc; # private header -> lib
my %cskip; # error_file -> lib
my %errorfile; # lib -> error file name
-my %fmax; # lib -> max assigned function code*
my %rmax; # lib -> max assigned reason code
-my %fassigned; # lib -> colon-separated list of assigned function codes*
my %rassigned; # lib -> colon-separated list of assigned reason codes
-my %fnew; # lib -> count of new function codes*
my %rnew; # lib -> count of new reason codes
my %rextra; # "extra" reason code -> lib
my %rcodes; # reason-name -> value
-my %ftrans; # old name -> #define-friendly name (all caps)*
-my %fcodes; # function-name -> value*
my $statefile; # state file with assigned reason and function codes
my %strings; # define -> text
@@ -162,11 +155,8 @@ while ( <IN> ) {
$cskip{$err} = $lib;
$errorfile{$lib} = $err;
next if $err eq 'NONE';
- $fmax{$lib} = 100;
$rmax{$lib} = 100;
- $fassigned{$lib} = ":";
$rassigned{$lib} = ":";
- $fnew{$lib} = 0;
$rnew{$lib} = 0;
die "Public header file must be in include/openssl ($pubhdr is not)\n"
if ($internal
@@ -235,9 +225,7 @@ if ( ! $reindex && $statefile ) {
}
$rcodes{$name} = $code;
} elsif ( $name =~ /^(?:OSSL_|OPENSSL_)?[A-Z0-9]{2,}_F_/ ) {
- $fassigned{$lib} .= "$code:";
- $fmax{$lib} = $code if $code > $fmax{$lib};
- $fcodes{$name} = $code;
+ # We do nothing with the function codes, just let them go away
} else {
die "Bad line in $statefile:\n$_\n";
}
@@ -254,131 +242,19 @@ if ( ! $reindex && $statefile ) {
print STDERR " --none--\n";
}
}
- print STDERR "\n";
- foreach my $lib ( sort keys %fmax ) {
- print STDERR "Function codes for ${lib}:\n";
- if ( $fassigned{$lib} =~ m/^:(.*):$/ ) {
- my @fassigned = sort { $a <=> $b } split( ":", $1 );
- print STDERR " ", join(' ', @fassigned), "\n";
- } else {
- print STDERR " --none--\n";
- }
- }
}
}
-# Scan each public header file and make a list of function codes and names
-&phase("Scanning headers");
-while ( ( my $hdr, my $lib ) = each %libpubinc ) {
- next if $hdr eq "NONE";
- print STDERR " ." if $debug;
- my $line = "";
- my $def = "";
- my $linenr = 0;
- my $cpp = 0;
-
- open(IN, "<$hdr")
- || open(IN, "<$hdr.in")
- || die "Can't open $hdr or $hdr.in, $!,";
- while ( <IN> ) {
- $linenr++;
-
- if ( $line ne '' ) {
- $_ = $line . $_;
- $line = '';
- }
-
- if ( /\\$/ ) {
- $line = $_;
- next;
- }
-
- if ( /\/\*/ ) {
- if ( not /\*\// ) { # multiline comment...
- $line = $_; # ... just accumulate
- next;
- } else {
- s/\/\*.*?\*\///gs; # wipe it
- }
- }
-
- if ( $cpp ) {
- $cpp++ if /^#\s*if/;
- $cpp-- if /^#\s*endif/;
- next;
- }
- $cpp = 1 if /^#.*ifdef.*cplusplus/; # skip "C" declaration
-
- next if /^\#/; # skip preprocessor directives
-
- s/{[^{}]*}//gs; # ignore {} blocks
-
- if ( /\{|\/\*/ ) { # Add a so editor works...
- $line = $_;
- } else {
- $def .= $_;
- }
- }
-
- # Delete any DECLARE_ macros
- my $defnr = 0;
- $def =~ s/DECLARE_\w+\([\w,\s]+\)//gs;
- foreach ( split /;/, $def ) {
- $defnr++;
- # The goal is to collect function names from function declarations.
-
- s/^[\n\s]*//g;
- s/[\n\s]*$//g;
-
- # Skip over recognized non-function declarations
- next if /typedef\W/;
-
- # Remove STACK_OF(foo)
- s/STACK_OF\(\w+\)/void/;
-
- # Reduce argument lists to empty ()
- # fold round brackets recursively: (t(*v)(t),t) -> (t{}{},t) -> {}
- while ( /\(.*\)/s ) {
- s/\([^\(\)]+\)/\{\}/gs;
- s/\(\s*\*\s*(\w+)\s*\{\}\s*\)/$1/gs; #(*f{}) -> f
- }
-
- # pretend as we didn't use curly braces: {} -> ()
- s/\{\}/\(\)/gs;
-
- # Last token just before the first () is a function name.
- if ( /(\w+)\s*\(\).*/s ) {
- my $name = $1;
- $name =~ tr/[a-z]/[A-Z]/;
- $ftrans{$name} = $1;
- } elsif ( /[\(\)]/ and not(/=/) ) {
- print STDERR "Header $hdr: cannot parse: $_;\n";
- }
- }
-
- next if $reindex;
-
- if ( $lib eq "SSL" && $rmax{$lib} >= 1000 ) {
- print STDERR "SSL error codes 1000+ are reserved for alerts.\n";
- print STDERR "Any new alerts must be added to $config.\n";
- $errors++;
- }
- close IN;
-}
-print STDERR "\n" if $debug;
-
-# Scan each C source file and look for function and reason codes
-# This is done by looking for strings that "look like" function or
-# reason codes: basically anything consisting of all upper case and
-# numerics which has _F_ or _R_ in it and which has the name of an
-# error library at the start. This seems to work fine except for the
-# oddly named structure BIO_F_CTX which needs to be ignored.
+# Scan each C source file and look for reason codes. This is done by
+# looking for strings that "look like" reason codes: basically anything
+# consisting of all upper case and numerics which _R_ in it and which has
+# the name of an error library at the start. Should there be anything else,
+# such as a type name, we add exceptions here.
# If a code doesn't exist in list compiled from headers then mark it
# with the value "X" as a place holder to give it a value later.
-# Store all function and reason codes found in %usedfuncs and %usedreasons
-# so all those unreferenced can be printed out.
+# Store all reason codes found in and %usedreasons so all those unreferenced
+# can be printed out.
&phase("Scanning source");
-my %usedfuncs;
my %usedreasons;
foreach my $file ( @source ) {
# Don't parse the error source file.
@@ -392,26 +268,7 @@ foreach my $file ( @source ) {
# skip obsoleted source files entirely!
last if /^#error\s+obsolete/;
$linenr++;
- if ( !/;$/ && /^\**([a-zA-Z_].*[\s*])?([A-Za-z_0-9]+)\(.*([),]|$)/ ) {
- /^([^()]*(\([^()]*\)[^()]*)*)\(/;
- $1 =~ /([A-Za-z_0-9]*)$/;
- $func = $1;
- }
- if ( /(((?:OSSL_|OPENSSL_)?[A-Z0-9]{2,})_F_([A-Z0-9_]+))/ ) {
- next unless exists $errorfile{$2};
- next if $errorfile{$2} eq 'NONE';
- next if $1 eq "BIO_F_BUFFER_CTX";
- $usedfuncs{$1} = 1;
- if ( !exists $fcodes{$1} ) {
- print STDERR " New function $1\n" if $debug;
- $fcodes{$1} = "X";
- $fnew{$2}++;
- }
- $ftrans{$3} = $func unless exists $ftrans{$3};
- print STDERR " Function $1 = $fcodes{$1}\n"
- if $debug;
- }
if ( /(((?:OSSL_|OPENSSL_)?[A-Z0-9]{2,})_R_[A-Z0-9_]+)/ ) {
next unless exists $errorfile{$2};
next if $errorfile{$2} eq 'NONE';
@@ -432,10 +289,9 @@ print STDERR "\n" if $debug;
&phase("Writing files");
my $newstate = 0;
foreach my $lib ( keys %errorfile ) {
- next if ! $fnew{$lib} && ! $rnew{$lib} && ! $rebuild;
+ next if ! $rnew{$lib} && ! $rebuild;
next if scalar keys %modules > 0 && !$modules{$lib};
next if $nowrite;
- print STDERR "$lib: $fnew{$lib} new functions\n" if $fnew{$lib};
print STDERR "$lib: $rnew{$lib} new reasons\n" if $rnew{$lib};
$newstate = 1;
@@ -443,7 +299,6 @@ foreach my $lib ( keys %errorfile ) {
# need to rebuild the header file and C file.
# Make a sorted list of error and reason codes for later use.
- my @function = sort grep( /^${lib}_/, keys %fcodes );
my @reasons = sort grep( /^${lib}_/, keys %rcodes );
# indent level for innermost preprocessor lines
@@ -509,26 +364,6 @@ EOF
# If this library doesn't have a public header file, we write all
# definitions that would end up there here instead
if ($hpubinc{$lib} eq 'NONE') {
- print OUT "\n/*\n * $lib function codes.\n */\n";
- print OUT "#${indent}ifndef OPENSSL_NO_DEPRECATED_3_0\n";
- foreach my $i ( @function ) {
- my $z = 48 - length($i);
- $z = 0 if $z < 0;
- if ( $fcodes{$i} eq "X" ) {
- $fassigned{$lib} =~ m/^:([^:]*):/;
- my $findcode = $1;
- $findcode = $fmax{$lib} if !defined $findcode;
- while ( $fassigned{$lib} =~ m/:$findcode:/ ) {
- $findcode++;
- }
- $fcodes{$i} = $findcode;
- $fassigned{$lib} .= "$findcode:";
- print STDERR "New Function code $i\n" if $debug;
- }
- printf OUT "#${indent} define $i%s 0\n", " " x $z;
- }
- print OUT "#${indent}endif\n";
-
print OUT "\n/*\n * $lib reason codes.\n */\n";
foreach my $i ( @reasons ) {
my $z = 48 - length($i);
@@ -632,26 +467,6 @@ EOF
}
}
- print OUT "\n/*\n * $lib function codes.\n */\n";
- print OUT "#${indent}ifndef OPENSSL_NO_DEPRECATED_3_0\n";
- foreach my $i ( @function ) {
- my $z = 48 - length($i);
- $z = 0 if $z < 0;
- if ( $fcodes{$i} eq "X" ) {
- $fassigned{$lib} =~ m/^:([^:]*):/;
- my $findcode = $1;
- $findcode = $fmax{$lib} if !defined $findcode;
- while ( $fassigned{$lib} =~ m/:$findcode:/ ) {
- $findcode++;
- }
- $fcodes{$i} = $findcode;
- $fassigned{$lib} .= "$findcode:";
- print STDERR "New Function code $i\n" if $debug;
- }
- printf OUT "#${indent} define $i%s 0\n", " " x $z;
- }
- print OUT "#${indent}endif\n";
-
print OUT "\n/*\n * $lib reason codes.\n */\n";
foreach my $i ( @reasons ) {
my $z = 48 - length($i);
@@ -833,22 +648,12 @@ EOF
}
&phase("Ending");
-# Make a list of unreferenced function and reason codes
+# Make a list of unreferenced reason codes
if ( $unref ) {
- my @funref;
- foreach ( keys %fcodes ) {
- push( @funref, $_ ) unless exists $usedfuncs{$_};
- }
my @runref;
foreach ( keys %rcodes ) {
push( @runref, $_ ) unless exists $usedreasons{$_};
}
- if ( @funref ) {
- print STDERR "The following function codes were not referenced:\n";
- foreach ( sort @funref ) {
- print STDERR " $_\n";
- }
- }
if ( @runref ) {
print STDERR "The following reason codes were not referenced:\n";
foreach ( sort @runref ) {
@@ -871,13 +676,6 @@ if ( $newstate ) {
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html
EOF
- print OUT "\n# Function codes\n";
- foreach my $i ( sort keys %fcodes ) {
- my $short = "$i:$fcodes{$i}:";
- my $t = exists $strings{$i} ? $strings{$i} : "";
- $t = "\\\n\t" . $t if length($short) + length($t) > 80;
- print OUT "$short$t\n";
- }
print OUT "\n#Reason codes\n";
foreach my $i ( sort keys %rcodes ) {
my $short = "$i:$rcodes{$i}:";