summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/mem_dbg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/mem_dbg.c')
-rw-r--r--src/lib/libcrypto/mem_dbg.c66
1 files changed, 29 insertions, 37 deletions
diff --git a/src/lib/libcrypto/mem_dbg.c b/src/lib/libcrypto/mem_dbg.c
index a399485300..866c53e73a 100644
--- a/src/lib/libcrypto/mem_dbg.c
+++ b/src/lib/libcrypto/mem_dbg.c
@@ -108,7 +108,7 @@ static LHASH *amih=NULL; /* hash-table with those app_mem_info_st's
108typedef struct mem_st 108typedef struct mem_st
109/* memory-block description */ 109/* memory-block description */
110 { 110 {
111 char *addr; 111 void *addr;
112 int num; 112 int num;
113 const char *file; 113 const char *file;
114 int line; 114 int line;
@@ -221,7 +221,7 @@ long CRYPTO_dbg_get_options(void)
221 221
222static int mem_cmp(MEM *a, MEM *b) 222static int mem_cmp(MEM *a, MEM *b)
223 { 223 {
224 return(a->addr - b->addr); 224 return((char *)a->addr - (char *)b->addr);
225 } 225 }
226 226
227static unsigned long mem_hash(MEM *a) 227static unsigned long mem_hash(MEM *a)
@@ -279,7 +279,7 @@ static APP_INFO *pop_info()
279 ret->next = NULL; 279 ret->next = NULL;
280 if (next != NULL) 280 if (next != NULL)
281 next->references--; 281 next->references--;
282 Free(ret); 282 OPENSSL_free(ret);
283 } 283 }
284 } 284 }
285 } 285 }
@@ -295,7 +295,7 @@ int CRYPTO_push_info_(const char *info, const char *file, int line)
295 { 295 {
296 MemCheck_off(); /* obtains CRYPTO_LOCK_MALLOC2 */ 296 MemCheck_off(); /* obtains CRYPTO_LOCK_MALLOC2 */
297 297
298 if ((ami = (APP_INFO *)Malloc(sizeof(APP_INFO))) == NULL) 298 if ((ami = (APP_INFO *)OPENSSL_malloc(sizeof(APP_INFO))) == NULL)
299 { 299 {
300 ret=0; 300 ret=0;
301 goto err; 301 goto err;
@@ -304,7 +304,7 @@ int CRYPTO_push_info_(const char *info, const char *file, int line)
304 { 304 {
305 if ((amih=lh_new(app_info_hash,app_info_cmp)) == NULL) 305 if ((amih=lh_new(app_info_hash,app_info_cmp)) == NULL)
306 { 306 {
307 Free(ami); 307 OPENSSL_free(ami);
308 ret=0; 308 ret=0;
309 goto err; 309 goto err;
310 } 310 }
@@ -386,9 +386,9 @@ void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line,
386 if (is_MemCheck_on()) 386 if (is_MemCheck_on())
387 { 387 {
388 MemCheck_off(); /* obtains CRYPTO_LOCK_MALLOC2 */ 388 MemCheck_off(); /* obtains CRYPTO_LOCK_MALLOC2 */
389 if ((m=(MEM *)Malloc(sizeof(MEM))) == NULL) 389 if ((m=(MEM *)OPENSSL_malloc(sizeof(MEM))) == NULL)
390 { 390 {
391 Free(addr); 391 OPENSSL_free(addr);
392 MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */ 392 MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */
393 return; 393 return;
394 } 394 }
@@ -396,8 +396,8 @@ void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line,
396 { 396 {
397 if ((mh=lh_new(mem_hash,mem_cmp)) == NULL) 397 if ((mh=lh_new(mem_hash,mem_cmp)) == NULL)
398 { 398 {
399 Free(addr); 399 OPENSSL_free(addr);
400 Free(m); 400 OPENSSL_free(m);
401 addr=NULL; 401 addr=NULL;
402 goto err; 402 goto err;
403 } 403 }
@@ -445,7 +445,7 @@ void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line,
445 { 445 {
446 mm->app_info->references--; 446 mm->app_info->references--;
447 } 447 }
448 Free(mm); 448 OPENSSL_free(mm);
449 } 449 }
450 err: 450 err:
451 MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */ 451 MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */
@@ -481,7 +481,7 @@ void CRYPTO_dbg_free(void *addr, int before_p)
481 { 481 {
482 mp->app_info->references--; 482 mp->app_info->references--;
483 } 483 }
484 Free(mp); 484 OPENSSL_free(mp);
485 } 485 }
486 486
487 MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */ 487 MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */
@@ -696,32 +696,6 @@ void CRYPTO_mem_leaks(BIO *b)
696#endif 696#endif
697 } 697 }
698 698
699union void_fn_to_char_u
700 {
701 char *char_p;
702 void (*fn_p)();
703 };
704
705static void cb_leak(MEM *m, char *cb)
706 {
707 union void_fn_to_char_u mem_callback;
708
709 mem_callback.char_p=cb;
710 mem_callback.fn_p(m->order,m->file,m->line,m->num,m->addr);
711 }
712
713void CRYPTO_mem_leaks_cb(void (*cb)())
714 {
715 union void_fn_to_char_u mem_cb;
716
717 if (mh == NULL) return;
718 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2);
719 mem_cb.fn_p=cb;
720 lh_doall_arg(mh,(void (*)())cb_leak,mem_cb.char_p);
721 mem_cb.char_p=NULL;
722 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2);
723 }
724
725#ifndef NO_FP_API 699#ifndef NO_FP_API
726void CRYPTO_mem_leaks_fp(FILE *fp) 700void CRYPTO_mem_leaks_fp(FILE *fp)
727 { 701 {
@@ -736,3 +710,21 @@ void CRYPTO_mem_leaks_fp(FILE *fp)
736 } 710 }
737#endif 711#endif
738 712
713
714
715/* FIXME: We really don't allow much to the callback. For example, it has
716 no chance of reaching the info stack for the item it processes. Should
717 it really be this way? -- Richard Levitte */
718static void cb_leak(MEM *m,
719 void (**cb)(unsigned long, const char *, int, int, void *))
720 {
721 (**cb)(m->order,m->file,m->line,m->num,m->addr);
722 }
723
724void CRYPTO_mem_leaks_cb(void (*cb)(unsigned long, const char *, int, int, void *))
725 {
726 if (mh == NULL) return;
727 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2);
728 lh_doall_arg(mh,(void (*)())cb_leak,(void *)&cb);
729 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2);
730 }