-static unsigned long order=0;
-
-static LHASH *amih=NULL;
-
-typedef struct app_mem_info_st
- {
- unsigned long thread;
- const char *file;
- int line;
- const char *info;
- struct app_mem_info_st *next;
- int references;
- } APP_INFO;
-
-static LHASH *mh=NULL;
-
-typedef struct mem_st
- {
- char *addr;
- 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
- APP_INFO *app_info;
- } MEM;
-
-int CRYPTO_mem_ctrl(int mode)
- {
- int ret=mh_mode;
-
- CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
- switch (mode)
- {
- /* for applications: */
- case CRYPTO_MEM_CHECK_ON: /* aka MemCheck_start() */
- mh_mode = CRYPTO_MEM_CHECK_ON|CRYPTO_MEM_CHECK_ENABLE;
- disabling_thread = 0;
- break;
- case CRYPTO_MEM_CHECK_OFF: /* aka MemCheck_stop() */
- mh_mode = 0;
- disabling_thread = 0;
- break;
-
- /* switch off temporarily (for library-internal use): */
- case CRYPTO_MEM_CHECK_DISABLE: /* aka MemCheck_off() */
- if (mh_mode & CRYPTO_MEM_CHECK_ON)
- {
- mh_mode&= ~CRYPTO_MEM_CHECK_ENABLE;
- if (disabling_thread != CRYPTO_thread_id())
- {
- CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2);
- disabling_thread=CRYPTO_thread_id();
- }
- }
- break;
- case CRYPTO_MEM_CHECK_ENABLE: /* aka MemCheck_on() */
- if (mh_mode & CRYPTO_MEM_CHECK_ON)
- {
- mh_mode|=CRYPTO_MEM_CHECK_ENABLE;
- if (disabling_thread != 0)
- {
- disabling_thread=0;
- CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2);
- }
- }
- break;
-
- default:
- break;
- }
- CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
- return(ret);
- }
-
-static int is_MemCheck_On()
- {
- int ret = 0;
-
- if (mh_mode & CRYPTO_MEM_CHECK_ON)
- {
- CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
-
- ret = (mh_mode & CRYPTO_MEM_CHECK_ENABLE)
- && disabling_thread != CRYPTO_thread_id();
-
- CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
- }
- return(ret);
- }
-
-static int mem_cmp(MEM *a, MEM *b)
- {
- return(a->addr - b->addr);
- }
-
-static unsigned long mem_hash(MEM *a)
- {
- unsigned long ret;
-
- ret=(unsigned long)a->addr;
-
- ret=ret*17851+(ret>>14)*7+(ret>>4)*251;
- return(ret);
- }
-
-static int app_info_cmp(APP_INFO *a, APP_INFO *b)
- {
- return(a->thread - b->thread);
- }
-
-static unsigned long app_info_hash(APP_INFO *a)
- {
- unsigned long ret;
-
- ret=(unsigned long)a->thread;
-
- ret=ret*17851+(ret>>14)*7+(ret>>4)*251;
- return(ret);
- }
-
-static APP_INFO *free_info(APP_INFO *app_info)
- {
- APP_INFO *next;
-
- if (app_info == NULL)
- return NULL;
-
- if (--(app_info->references) > 0)
- return app_info;
-
- app_info->references = 0;
-
- next = app_info->next;
- app_info->next = NULL; /* Just to make sure */
-
- Free(app_info);
- if (next != app_info)
- return free_info(next);
- return NULL;
- }
-
-static APP_INFO *remove_info()
- {
- APP_INFO tmp;
- APP_INFO *ret = NULL;
-
- if (amih != NULL)
- {
- tmp.thread=CRYPTO_thread_id();
- if ((ret=(APP_INFO *)lh_delete(amih,(char *)&tmp)) != NULL)
- {
- APP_INFO *next=ret->next;
-#ifdef LEVITTE_DEBUG
- if (ret->thread != tmp.thread)
- {
- fprintf(stderr, "remove_info(): deleted info has other thread ID (%lu) than the current thread (%lu)!!!!\n",
- ret->thread, tmp.thread);
- abort();
- }
-#endif
- if (next != NULL)
- {
- lh_insert(amih,(char *)next);
- }
- free_info(ret);
- }
- }
- return(ret);
- }
-
-int CRYPTO_add_info(const char *file, int line, const char *info)
- {
- APP_INFO *ami, *amim;
- int ret=0;
-
- if (is_MemCheck_On())
- {
- MemCheck_off();
-
- if ((ami = (APP_INFO *)Malloc(sizeof(APP_INFO))) == NULL)
- {
- ret=0;
- goto err;
- }
- if (amih == NULL)
- {
- if ((amih=lh_new(app_info_hash,app_info_cmp)) == NULL)
- {
- Free(ami);
- ret=0;
- goto err;
- }
- }
-
- ami->thread=CRYPTO_thread_id();
- ami->file=file;
- ami->line=line;
- ami->info=info;
- ami->references=1;
- ami->next=NULL;
-
- if ((amim=(APP_INFO *)lh_insert(amih,(char *)ami)) != NULL)
- {
-#ifdef LEVITTE_DEBUG
- if (ami->thread != amim->thread)
- {
- fprintf(stderr, "CRYPTO_add_info(): previous info has other thread ID (%lu) than the current thread (%lu)!!!!\n",
- amim->thread, ami->thread);
- abort();
- }
-#endif
- ami->next=amim;
- }
- err:
- MemCheck_on();
- }
-
- return(ret);
- }
-
-int CRYPTO_remove_info()
- {
- int ret=0;
-
- if (is_MemCheck_On())
- {
- MemCheck_off();
-
- ret=(remove_info() != NULL);
-
- MemCheck_on();
- }
- return(ret);
- }
-
-static char *(*malloc_locked_func)()=(char *(*)())malloc;
-static void (*free_locked_func)()=(void (*)())free;
-static char *(*malloc_func)()= (char *(*)())malloc;
-static char *(*realloc_func)()= (char *(*)())realloc;
-static void (*free_func)()= (void (*)())free;
-
-void CRYPTO_set_mem_functions(char *(*m)(), char *(*r)(), void (*f)())
- {
- if ((m == NULL) || (r == NULL) || (f == NULL)) return;
- malloc_func=m;
- realloc_func=r;
- free_func=f;
- malloc_locked_func=m;
- free_locked_func=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(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(char *(**m)(), void (**f)())
- {
- if (m != NULL) *m=malloc_locked_func;
- if (f != NULL) *f=free_locked_func;
- }
-
-void *CRYPTO_malloc_locked(int num)
- {
- return(malloc_locked_func(num));
- }
-
-void CRYPTO_free_locked(void *str)
- {
- free_locked_func(str);
- }
-
-void *CRYPTO_malloc(int num)
- {
- return(malloc_func(num));
- }
-
-void *CRYPTO_realloc(void *str, int num)
- {
- return(realloc_func(str,num));
- }
-
-void CRYPTO_free(void *str)
- {
- free_func(str);
- }
-
-static unsigned long break_order_num=0;
-void *CRYPTO_dbg_malloc(int num, const char *file, int line)
- {
- char *ret;
- MEM *m,*mm;
- APP_INFO tmp,*amim;
-
- if ((ret=malloc_func(num)) == NULL)
- return(NULL);
-
- if (is_MemCheck_On())
- {
- MemCheck_off();
- if ((m=(MEM *)Malloc(sizeof(MEM))) == NULL)
- {
- Free(ret);
- MemCheck_on();
- return(NULL);
- }
- if (mh == NULL)
- {
- if ((mh=lh_new(mem_hash,mem_cmp)) == NULL)
- {
- Free(ret);
- Free(m);
- ret=NULL;
- goto err;
- }
- }
-
- m->addr=ret;
- 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