Cosmetic changes.
[openssl.git] / crypto / mem.c
index f47ea6b4a23e97f287cbfa24f4693c7d22b3b445..61fc1e184ed6b4e87765f2a22989e17e1c2f5faf 100644 (file)
 
 #include <stdio.h>
 #include <stdlib.h>
-#include "buffer.h"
-#include "bio.h"
-#include "lhash.h"
+#include <openssl/crypto.h>
+#ifdef CRYPTO_MDEBUG_TIME
+# include <time.h>     
+#endif
+#include <openssl/buffer.h>
+#include <openssl/bio.h>
+#include <openssl/lhash.h>
 #include "cryptlib.h"
 
-#ifdef CRYPTO_MDEBUG
-static int mh_mode=CRYPTO_MEM_CHECK_ON;
-#else
+/* #ifdef CRYPTO_MDEBUG */
+/* static int mh_mode=CRYPTO_MEM_CHECK_ON; */
+/* #else */
 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 LHASH *mh=NULL;
@@ -78,30 +92,39 @@ typedef struct mem_st
        int num;
        const char *file;
        int line;
+#ifdef CRYPTO_MDEBUG_THREAD
+       unsigned long thread;
+#endif
        unsigned long order;
+#ifdef CRYPTO_MDEBUG_TIME
+       time_t time;
+#endif
        } MEM;
 
-int CRYPTO_mem_ctrl(mode)
-int mode;
+int CRYPTO_mem_ctrl(int mode)
        {
        int ret=mh_mode;
 
        CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
        switch (mode)
                {
-       case CRYPTO_MEM_CHECK_ON:
-               mh_mode|=CRYPTO_MEM_CHECK_ON;
+       /* for applications: */
+       case CRYPTO_MEM_CHECK_ON: /* aka MemCheck_start() */
+               mh_mode = CRYPTO_MEM_CHECK_ON|CRYPTO_MEM_CHECK_ENABLE;
                break;
-       case CRYPTO_MEM_CHECK_OFF:
-               mh_mode&= ~CRYPTO_MEM_CHECK_ON;
+       case CRYPTO_MEM_CHECK_OFF: /* aka MemCheck_stop() */
+               mh_mode = 0;
                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;
                break;
-       case CRYPTO_MEM_CHECK_ENABLE:
+       case CRYPTO_MEM_CHECK_ENABLE: /* aka MemCheck_on() */
                if (mh_mode&CRYPTO_MEM_CHECK_ON)
                        mh_mode|=CRYPTO_MEM_CHECK_ENABLE;
                break;
+
        default:
                break;
                }
@@ -109,14 +132,12 @@ int mode;
        return(ret);
        }
 
-static int mem_cmp(a,b)
-MEM *a,*b;
+static int mem_cmp(MEM *a, MEM *b)
        {
        return(a->addr - b->addr);
        }
 
-static unsigned long mem_hash(a)
-MEM *a;
+static unsigned long mem_hash(MEM *a)
        {
        unsigned long ret;
 
@@ -132,10 +153,7 @@ static char *(*malloc_func)()=     (char *(*)())malloc;
 static char *(*realloc_func)()=        (char *(*)())realloc;
 static void (*free_func)()=    (void (*)())free;
 
-void CRYPTO_set_mem_functions(m,r,f)
-char *(*m)();
-char *(*r)();
-void (*f)();
+void CRYPTO_set_mem_functions(char *(*m)(), char *(*r)(), void (*f)())
        {
        if ((m == NULL) || (r == NULL) || (f == NULL)) return;
        malloc_func=m;
@@ -145,69 +163,53 @@ void (*f)();
        free_locked_func=f;
        }
 
-void CRYPTO_set_locked_mem_functions(m,f)
-char *(*m)();
-void (*f)();
+void CRYPTO_set_locked_mem_functions(char *(*m)(), void (*f)())
        {
        if ((m == NULL) || (f == NULL)) return;
        malloc_locked_func=m;
        free_locked_func=f;
        }
 
-void CRYPTO_get_mem_functions(m,r,f)
-char *(**m)();
-char *(**r)();
-void (**f)();
+void CRYPTO_get_mem_functions(char *(**m)(), char *(**r)(), void (**f)())
        {
        if (m != NULL) *m=malloc_func;
        if (r != NULL) *r=realloc_func;
        if (f != NULL) *f=free_func;
        }
 
-void CRYPTO_get_locked_mem_functions(m,f)
-char *(**m)();
-void (**f)();
+void CRYPTO_get_locked_mem_functions(char *(**m)(), void (**f)())
        {
        if (m != NULL) *m=malloc_locked_func;
        if (f != NULL) *f=free_locked_func;
        }
 
-void *CRYPTO_malloc_locked(num)
-int num;
+void *CRYPTO_malloc_locked(int num)
        {
        return(malloc_locked_func(num));
        }
 
-void CRYPTO_free_locked(str)
-void *str;
+void CRYPTO_free_locked(void *str)
        {
        free_locked_func(str);
        }
 
-void *CRYPTO_malloc(num)
-int num;
+void *CRYPTO_malloc(int num)
        {
        return(malloc_func(num));
        }
 
-void *CRYPTO_realloc(str,num)
-void *str;
-int num;
+void *CRYPTO_realloc(void *str, int num)
        {
        return(realloc_func(str,num));
        }
 
-void CRYPTO_free(str)
-void *str;
+void CRYPTO_free(void *str)
        {
        free_func(str);
        }
 
 static unsigned long break_order_num=0;
-void *CRYPTO_dbg_malloc(num,file,line)
-int num;
-const char *file;
-int line;
+void *CRYPTO_dbg_malloc(int num, const char *file, int line)
        {
        char *ret;
        MEM *m,*mm;
@@ -240,12 +242,18 @@ int line;
                m->file=file;
                m->line=line;
                m->num=num;
+#ifdef CRYPTO_MDEBUG_THREAD
+               m->thread=CRYPTO_thread_id();
+#endif
                if (order == break_order_num)
                        {
                        /* BREAK HERE */
                        m->order=order;
                        }
                m->order=order++;
+#ifdef CRYPTO_MDEBUG_TIME
+               m->time=time(NULL);
+#endif
                if ((mm=(MEM *)lh_insert(mh,(char *)m)) != NULL)
                        {
                        /* Not good, but don't sweat it */
@@ -258,8 +266,7 @@ err:
        return(ret);
        }
 
-void CRYPTO_dbg_free(addr)
-void *addr;
+void CRYPTO_dbg_free(void *addr)
        {
        MEM m,*mp;
 
@@ -277,11 +284,7 @@ void *addr;
        free_func(addr);
        }
 
-void *CRYPTO_dbg_realloc(addr,num,file,line)
-void *addr;
-int num;
-const char *file;
-int line;
+void *CRYPTO_dbg_realloc(void *addr, int num, const char *file, int line)
        {
        char *ret;
        MEM m,*mp;
@@ -307,20 +310,14 @@ int line;
        return(ret);
        }
 
-void *CRYPTO_remalloc(a,n)
-void *a;
-int n;
+void *CRYPTO_remalloc(void *a, int n)
        {
        if (a != NULL) Free(a);
        a=(char *)Malloc(n);
        return(a);
        }
 
-void *CRYPTO_dbg_remalloc(a,n,file,line)
-void *a;
-int n;
-const char *file;
-int line;
+void *CRYPTO_dbg_remalloc(void *a, int n, const char *file, int line)
        {
        if (a != NULL) CRYPTO_dbg_free(a);
        a=(char *)CRYPTO_dbg_malloc(n,file,line);
@@ -335,23 +332,44 @@ typedef struct mem_leak_st
        long bytes;
        } MEM_LEAK;
 
-static void print_leak(m,l)
-MEM *m;
-MEM_LEAK *l;
+static void print_leak(MEM *m, MEM_LEAK *l)
        {
        char buf[128];
+#ifdef CRYPTO_MDEBUG_TIME
+       struct tm *lcl;
+#endif
 
        if(m->addr == (char *)l->bio)
            return;
-       sprintf(buf,"%5ld file=%s, line=%d, number=%d, address=%08lX\n",
-               m->order,m->file,m->line,m->num,(long)m->addr);
+
+#ifdef CRYPTO_MDEBUG_TIME
+       lcl = localtime(&m->time);
+#endif
+
+       sprintf(buf,
+#ifdef CRYPTO_MDEBUG_TIME
+               "[%02d:%02d:%02d] "
+#endif
+               "%5lu file=%s, line=%d, "
+#ifdef CRYPTO_MDEBUG_THREAD
+               "thread=%lu, "
+#endif
+               "number=%d, address=%08lX\n",
+#ifdef CRYPTO_MDEBUG_TIME
+               lcl->tm_hour,lcl->tm_min,lcl->tm_sec,
+#endif
+               m->order,m->file,m->line,
+#ifdef CRYPTO_MDEBUG_THREAD
+               m->thread,
+#endif
+               m->num,(unsigned long)m->addr);
+
        BIO_puts(l->bio,buf);
        l->chunks++;
        l->bytes+=m->num;
        }
 
-void CRYPTO_mem_leaks(b)
-BIO *b;
+void CRYPTO_mem_leaks(BIO *b)
        {
        MEM_LEAK ml;
        char buf[80];
@@ -372,23 +390,20 @@ BIO *b;
 
 #if 0
        lh_stats_bio(mh,b);
-        lh_node_stats_bio(mh,b);
-        lh_node_usage_stats_bio(mh,b);
+       lh_node_stats_bio(mh,b);
+       lh_node_usage_stats_bio(mh,b);
 #endif
        }
 
 static void (*mem_cb)()=NULL;
 
-static void cb_leak(m,cb)
-MEM *m;
-char *cb;
+static void cb_leak(MEM *m, char *cb)
        {
        void (*mem_callback)()=(void (*)())cb;
        mem_callback(m->order,m->file,m->line,m->num,m->addr);
        }
 
-void CRYPTO_mem_leaks_cb(cb)
-void (*cb)();
+void CRYPTO_mem_leaks_cb(void (*cb)())
        {
        if (mh == NULL) return;
        CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
@@ -399,8 +414,7 @@ void (*cb)();
        }
 
 #ifndef NO_FP_API
-void CRYPTO_mem_leaks_fp(fp)
-FILE *fp;
+void CRYPTO_mem_leaks_fp(FILE *fp)
        {
        BIO *b;