diff options
Diffstat (limited to 'src/lib/libcrypto/mem_dbg.c')
-rw-r--r-- | src/lib/libcrypto/mem_dbg.c | 66 |
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 | |||
108 | typedef struct mem_st | 108 | typedef 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 | ||
222 | static int mem_cmp(MEM *a, MEM *b) | 222 | static 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 | ||
227 | static unsigned long mem_hash(MEM *a) | 227 | static 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 | ||
699 | union void_fn_to_char_u | ||
700 | { | ||
701 | char *char_p; | ||
702 | void (*fn_p)(); | ||
703 | }; | ||
704 | |||
705 | static 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 | |||
713 | void 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 |
726 | void CRYPTO_mem_leaks_fp(FILE *fp) | 700 | void 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 */ | ||
718 | static 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 | |||
724 | void 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 | } | ||