Fix memory checking.

This commit is contained in:
Bodo Möller
1999-07-09 16:27:30 +00:00
parent a026fd201f
commit 777ab7e611
6 changed files with 42 additions and 14 deletions

14
CHANGES
View File

@@ -4,6 +4,20 @@
Changes between 0.9.3a and 0.9.4 Changes between 0.9.3a and 0.9.4
*) Memory leak checking had some problems. The interface is as follows:
Applications can use
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON) aka MemCheck_start(),
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF) aka MemCheck_stop();
"off" is now the default.
The library internally uses
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE) aka MemCheck_off(),
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE) aka MemCheck_on()
to disable memory-checking temporarily.
Some inconsistent states that previously were possible (and were
even the default) are now avoided.
[Bodo Moeller]
*) Introduce "mode" for SSL structures (with defaults in SSL_CTX), *) Introduce "mode" for SSL structures (with defaults in SSL_CTX),
which largely parallels "options", but is for changing API behaviour, which largely parallels "options", but is for changing API behaviour,
whereas "options" are about protocol behaviour. whereas "options" are about protocol behaviour.

View File

@@ -136,7 +136,7 @@ int main(int Argc, char *Argv[])
if ((bio_err=BIO_new(BIO_s_file())) != NULL) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
ERR_load_crypto_strings(); ERR_load_crypto_strings();

View File

@@ -134,7 +134,7 @@ int main(int argc, char **argv)
if (bio_err == NULL) if (bio_err == NULL)
bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
BIO_printf(bio_err,"test generation of DSA parameters\n"); BIO_printf(bio_err,"test generation of DSA parameters\n");
BIO_printf(bio_err,"expect '.*' followed by 5 lines of '.'s and '+'s\n"); BIO_printf(bio_err,"expect '.*' followed by 5 lines of '.'s and '+'s\n");

View File

@@ -63,11 +63,21 @@
#include <openssl/lhash.h> #include <openssl/lhash.h>
#include "cryptlib.h" #include "cryptlib.h"
#ifdef CRYPTO_MDEBUG /* #ifdef CRYPTO_MDEBUG */
static int mh_mode=CRYPTO_MEM_CHECK_ON; /* static int mh_mode=CRYPTO_MEM_CHECK_ON; */
#else /* #else */
static int mh_mode=CRYPTO_MEM_CHECK_OFF; static int mh_mode=CRYPTO_MEM_CHECK_OFF;
#endif /* #endif */
/* State CRYPTO_MEM_CHECK_ON exists only temporarily when the library
* thinks that certain allocations should not be checked (e.g. the data
* structures used for memory checking). It is not suitable as an initial
* state: the library will unexpectedly enable memory checking when it
* executes one of those sections that want to disable checking
* temporarily.
*
* State CRYPTO_MEM_CHECK_ENABLE without ..._ON makes no sense whatsoever.
*/
static unsigned long order=0; static unsigned long order=0;
static LHASH *mh=NULL; static LHASH *mh=NULL;
@@ -88,19 +98,23 @@ int CRYPTO_mem_ctrl(int mode)
CRYPTO_w_lock(CRYPTO_LOCK_MALLOC); CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
switch (mode) switch (mode)
{ {
case CRYPTO_MEM_CHECK_ON: /* for applications: */
mh_mode|=CRYPTO_MEM_CHECK_ON; case CRYPTO_MEM_CHECK_ON: /* aka MemCheck_start() */
mh_mode = CRYPTO_MEM_CHECK_ON|CRYPTO_MEM_CHECK_ENABLE;
break; break;
case CRYPTO_MEM_CHECK_OFF: case CRYPTO_MEM_CHECK_OFF: /* aka MemCheck_stop() */
mh_mode&= ~CRYPTO_MEM_CHECK_ON; mh_mode = 0;
break; break;
case CRYPTO_MEM_CHECK_DISABLE:
/* switch off temporarily (for library-internal use): */
case CRYPTO_MEM_CHECK_DISABLE: /* aka MemCheck_off() */
mh_mode&= ~CRYPTO_MEM_CHECK_ENABLE; mh_mode&= ~CRYPTO_MEM_CHECK_ENABLE;
break; break;
case CRYPTO_MEM_CHECK_ENABLE: case CRYPTO_MEM_CHECK_ENABLE: /* aka MemCheck_on() */
if (mh_mode&CRYPTO_MEM_CHECK_ON) if (mh_mode&CRYPTO_MEM_CHECK_ON)
mh_mode|=CRYPTO_MEM_CHECK_ENABLE; mh_mode|=CRYPTO_MEM_CHECK_ENABLE;
break; break;
default: default:
break; break;
} }

View File

@@ -216,7 +216,7 @@ int main()
int clen = 0; int clen = 0;
int num; int num;
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
plen = sizeof(ptext_ex) - 1; plen = sizeof(ptext_ex) - 1;

View File

@@ -163,7 +163,7 @@ int main(int argc, char *argv[])
bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
bio_stdout=BIO_new_fp(stdout,BIO_NOCLOSE); bio_stdout=BIO_new_fp(stdout,BIO_NOCLOSE);
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
argc--; argc--;
argv++; argv++;