diff --git a/CHANGES b/CHANGES index 4eb839823b5e76bfd8d5161d6e84f38c8d508a72..9cee7298e0a27d18349ca0de227a7c6719091769 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 447e3d70b33071ee1fe2779aaf9eb96ae7153dd9..a4b9d3bd60475ceab326ca2e211bc0a4bac6b8f5 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 cf98fb515e4b94e52ef4a56cf04bdc4e344f1779..dceea44b5031a56b8c9a2747465170f97a1a6682 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 6a093201dccac0046dd56e7958b10acb13b3ae3d..228b4f8184d414876c5430fcb0803f79cdf48ee8 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 9f5fba91467831f6739a1b9e56c0e61b008fe887..1a51f677bd878ecabfb4cae2e7e837ad9136a0ec 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 <