From e41c8d6ad4d1ffab51865d8cf90baff108bbe4a1 Mon Sep 17 00:00:00 2001 From: Geoff Thorpe Date: Thu, 1 Jun 2000 05:13:52 +0000 Subject: [PATCH] This change will cause builds (by default) to not use different STACK structures and functions for each stack type. The previous behaviour can be enabled by configuring with the "-DDEBUG_SAFESTACK" option. This will also cause "make update" (mkdef.pl in particular) to update the libeay.num and ssleay.num symbol tables with the number of extra functions DEBUG_SAFESTACK creates. The way this change works is to accompany each DECLARE_STACK_OF() macro with a set of "#define"d versions of the sk_##type##_*** functions that ensures all the existing "type-safe" stack calls are precompiled into the underlying stack calls. The presence or abscence of the DEBUG_SAFESTACK symbol controls whether this block of "#define"s or the DECLARE_STACK_OF() macro is taking effect. The block of "#define"s is in turn generated and maintained by a perl script (util/mkstack.pl) that encompasses the block with delimiting C comments. This works in a similar way to the auto-generated error codes and, like the other such maintenance utilities, is invoked by the "make update" target. A long (but mundane) commit will follow this with the results of "make update" - this will include all the "#define" blocks for each DECLARE_STACK_OF() statement, along with stripped down libeay.num and ssleay.num files. --- CHANGES | 8 +++ Configure | 5 +- Makefile.org | 5 +- crypto/stack/safestack.h | 11 ++++ util/mkdef.pl | 4 +- util/mkstack.pl | 112 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 142 insertions(+), 3 deletions(-) create mode 100755 util/mkstack.pl diff --git a/CHANGES b/CHANGES index 4eb839823b..9cee7298e0 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,14 @@ Changes between 0.9.5a and 0.9.6 [xx XXX 2000] + *) The type-safe stack code has been rejigged. It is now only compiled + in when OpenSSL is configured with the DEBUG_SAFESTACK option and + by default all type-specific stack functions are "#define"d back to + standard stack functions. This results in more streamlined output + but retains the type-safety checking possibilities of the original + approach. + [Geoff Thorpe] + *) The STACK code has been cleaned up, and certain type declarations that didn't make a lot of sense have been brought in line. This has also involved a cleanup of sorts in safestack.h to more correctly diff --git a/Configure b/Configure index 447e3d70b3..a4b9d3bd60 100755 --- a/Configure +++ b/Configure @@ -33,7 +33,10 @@ my $usage="Usage: Configure [no- ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [- # 386 generate 80386 code # no- build without specified algorithm (rsa, idea, rc5, ...) # - + compiler options are passed through -# +# +# DEBUG_SAFESTACK use type-safe stacks to enforce type-safety on stack items +# provided to stack calls. Generates unique stack functions for +# each possible stack type. # DES_PTR use pointer lookup vs arrays in the DES in crypto/des/des_locl.h # DES_RISC1 use different DES_ENCRYPT macro that helps reduce register # dependancies but needs to more registers, good for RISC CPU's diff --git a/Makefile.org b/Makefile.org index cf98fb515e..dceea44b50 100644 --- a/Makefile.org +++ b/Makefile.org @@ -299,6 +299,9 @@ tags: errors: perl util/mkerr.pl -recurse -write +stacks: + perl util/mkstack.pl -recurse + util/libeay.num:: perl util/mkdef.pl crypto update @@ -312,7 +315,7 @@ TABLE: Configure (echo 'Output of `Configure TABLE'"':"; \ perl Configure TABLE) > TABLE -update: depend errors util/libeay.num util/ssleay.num crypto/objects/obj_dat.h TABLE +update: depend errors stacks util/libeay.num util/ssleay.num crypto/objects/obj_dat.h TABLE tar: @$(TAR) $(TARFLAGS) -cvf - \ diff --git a/crypto/stack/safestack.h b/crypto/stack/safestack.h index 6a093201dc..228b4f8184 100644 --- a/crypto/stack/safestack.h +++ b/crypto/stack/safestack.h @@ -57,6 +57,8 @@ #include +#ifdef DEBUG_SAFESTACK + #define STACK_OF(type) struct stack_st_##type #define PREDECLARE_STACK_OF(type) STACK_OF(type); @@ -133,4 +135,13 @@ type *sk_##type##_pop(STACK_OF(type) *sk) \ void sk_##type##_sort(STACK_OF(type) *sk) \ { sk_sort((STACK *)sk); } +#else + +#define STACK_OF(type) STACK +#define PREDECLARE_STACK_OF(type) /* nada */ +#define DECLARE_STACK_OF(type) /* nada */ +#define IMPLEMENT_STACK_OF(type) /* nada */ + +#endif + #endif /* ndef HEADER_SAFESTACK_H */ diff --git a/util/mkdef.pl b/util/mkdef.pl index 9f5fba9146..1a51f677bd 100755 --- a/util/mkdef.pl +++ b/util/mkdef.pl @@ -18,7 +18,7 @@ my $rsaref = 0; my $W32=1; my $NT=0; # Set this to make typesafe STACK definitions appear in DEF -my $safe_stack_def = 1; +my $safe_stack_def = 0; my $options=""; open(IN,", , , ); +} else { + @source = @ARGV; +} + +foreach $file (@source) { + # After "Configure" has been run, we need to make sure we don't + # overwrite symbollic links with new header files! + next if -l $file; + + # Open the .c/.h file for reading + open(IN, "< $file") || die "Can't open $file for reading: $!"; + open(OUT, "> $file.tmp") || die "Can't open $file.tmp for writing: $!"; + + select(OUT); + process_the_file(); + + close(OUT); + close(IN); + + unlink($file); + rename("$file.tmp", $file); +} + +sub process_the_file { + + my $inside_block = 0; + my $output_defines = 0; + + while() { + if (/^DECLARE_STACK_OF\(([^)]+)\)/) { + $type_thing = $1; + $output_defines = 1; + } + if (m|^/\* This block of defines is updated by a perl script, please do not touch! \*/|) { + $inside_block = 1; + } + if (m|^/\* End of perl script block, you may now edit :-\) \*/|) { + $inside_block = 0; + } elsif ($inside_block == 0) { + print; + } + if($output_defines == 1) { + print <