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.c258
1 files changed, 101 insertions, 157 deletions
diff --git a/src/lib/libcrypto/mem_dbg.c b/src/lib/libcrypto/mem_dbg.c
index ac793397f1..c6dee9a92b 100644
--- a/src/lib/libcrypto/mem_dbg.c
+++ b/src/lib/libcrypto/mem_dbg.c
@@ -55,59 +55,6 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 57 */
58/* ====================================================================
59 * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111 58
112#include <stdio.h> 59#include <stdio.h>
113#include <stdlib.h> 60#include <stdlib.h>
@@ -134,11 +81,8 @@ static int mh_mode=CRYPTO_MEM_CHECK_OFF;
134 */ 81 */
135 82
136static unsigned long order = 0; /* number of memory requests */ 83static unsigned long order = 0; /* number of memory requests */
137 84static LHASH *mh=NULL; /* hash-table of memory requests (address as key);
138DECLARE_LHASH_OF(MEM); 85 * access requires MALLOC2 lock */
139static LHASH_OF(MEM) *mh=NULL; /* hash-table of memory requests
140 * (address as key); access requires
141 * MALLOC2 lock */
142 86
143 87
144typedef struct app_mem_info_st 88typedef struct app_mem_info_st
@@ -149,8 +93,8 @@ typedef struct app_mem_info_st
149 * CRYPTO_pop_info() to pop an entry, 93 * CRYPTO_pop_info() to pop an entry,
150 * CRYPTO_remove_all_info() to pop all entries. 94 * CRYPTO_remove_all_info() to pop all entries.
151 */ 95 */
152 { 96 {
153 CRYPTO_THREADID threadid; 97 unsigned long thread;
154 const char *file; 98 const char *file;
155 int line; 99 int line;
156 const char *info; 100 const char *info;
@@ -160,13 +104,10 @@ typedef struct app_mem_info_st
160 104
161static void app_info_free(APP_INFO *); 105static void app_info_free(APP_INFO *);
162 106
163DECLARE_LHASH_OF(APP_INFO); 107static LHASH *amih=NULL; /* hash-table with those app_mem_info_st's
164static LHASH_OF(APP_INFO) *amih=NULL; /* hash-table with those 108 * that are at the top of their thread's stack
165 * app_mem_info_st's that are at 109 * (with `thread' as key);
166 * the top of their thread's 110 * access requires MALLOC2 lock */
167 * stack (with `thread' as key);
168 * access requires MALLOC2
169 * lock */
170 111
171typedef struct mem_st 112typedef struct mem_st
172/* memory-block description */ 113/* memory-block description */
@@ -175,7 +116,7 @@ typedef struct mem_st
175 int num; 116 int num;
176 const char *file; 117 const char *file;
177 int line; 118 int line;
178 CRYPTO_THREADID threadid; 119 unsigned long thread;
179 unsigned long order; 120 unsigned long order;
180 time_t time; 121 time_t time;
181 APP_INFO *app_info; 122 APP_INFO *app_info;
@@ -195,11 +136,11 @@ static unsigned int num_disable = 0; /* num_disable > 0
195 * iff 136 * iff
196 * mh_mode == CRYPTO_MEM_CHECK_ON (w/o ..._ENABLE) 137 * mh_mode == CRYPTO_MEM_CHECK_ON (w/o ..._ENABLE)
197 */ 138 */
198 139static unsigned long disabling_thread = 0; /* Valid iff num_disable > 0.
199/* Valid iff num_disable > 0. CRYPTO_LOCK_MALLOC2 is locked exactly in this 140 * CRYPTO_LOCK_MALLOC2 is locked
200 * case (by the thread named in disabling_thread). 141 * exactly in this case (by the
201 */ 142 * thread named in disabling_thread).
202static CRYPTO_THREADID disabling_threadid; 143 */
203 144
204static void app_info_free(APP_INFO *inf) 145static void app_info_free(APP_INFO *inf)
205 { 146 {
@@ -236,9 +177,7 @@ int CRYPTO_mem_ctrl(int mode)
236 case CRYPTO_MEM_CHECK_DISABLE: /* aka MemCheck_off() */ 177 case CRYPTO_MEM_CHECK_DISABLE: /* aka MemCheck_off() */
237 if (mh_mode & CRYPTO_MEM_CHECK_ON) 178 if (mh_mode & CRYPTO_MEM_CHECK_ON)
238 { 179 {
239 CRYPTO_THREADID cur; 180 if (!num_disable || (disabling_thread != CRYPTO_thread_id())) /* otherwise we already have the MALLOC2 lock */
240 CRYPTO_THREADID_current(&cur);
241 if (!num_disable || CRYPTO_THREADID_cmp(&disabling_threadid, &cur)) /* otherwise we already have the MALLOC2 lock */
242 { 181 {
243 /* Long-time lock CRYPTO_LOCK_MALLOC2 must not be claimed while 182 /* Long-time lock CRYPTO_LOCK_MALLOC2 must not be claimed while
244 * we're holding CRYPTO_LOCK_MALLOC, or we'll deadlock if 183 * we're holding CRYPTO_LOCK_MALLOC, or we'll deadlock if
@@ -256,7 +195,7 @@ int CRYPTO_mem_ctrl(int mode)
256 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2); 195 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2);
257 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC); 196 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
258 mh_mode &= ~CRYPTO_MEM_CHECK_ENABLE; 197 mh_mode &= ~CRYPTO_MEM_CHECK_ENABLE;
259 CRYPTO_THREADID_cpy(&disabling_threadid, &cur); 198 disabling_thread=CRYPTO_thread_id();
260 } 199 }
261 num_disable++; 200 num_disable++;
262 } 201 }
@@ -289,12 +228,10 @@ int CRYPTO_is_mem_check_on(void)
289 228
290 if (mh_mode & CRYPTO_MEM_CHECK_ON) 229 if (mh_mode & CRYPTO_MEM_CHECK_ON)
291 { 230 {
292 CRYPTO_THREADID cur;
293 CRYPTO_THREADID_current(&cur);
294 CRYPTO_r_lock(CRYPTO_LOCK_MALLOC); 231 CRYPTO_r_lock(CRYPTO_LOCK_MALLOC);
295 232
296 ret = (mh_mode & CRYPTO_MEM_CHECK_ENABLE) 233 ret = (mh_mode & CRYPTO_MEM_CHECK_ENABLE)
297 || CRYPTO_THREADID_cmp(&disabling_threadid, &cur); 234 || (disabling_thread != CRYPTO_thread_id());
298 235
299 CRYPTO_r_unlock(CRYPTO_LOCK_MALLOC); 236 CRYPTO_r_unlock(CRYPTO_LOCK_MALLOC);
300 } 237 }
@@ -312,49 +249,49 @@ long CRYPTO_dbg_get_options(void)
312 return options; 249 return options;
313 } 250 }
314 251
315static int mem_cmp(const MEM *a, const MEM *b) 252/* static int mem_cmp(MEM *a, MEM *b) */
253static int mem_cmp(const void *a_void, const void *b_void)
316 { 254 {
317#ifdef _WIN64 255#ifdef _WIN64
318 const char *ap=(const char *)a->addr, 256 const char *a=(const char *)((const MEM *)a_void)->addr,
319 *bp=(const char *)b->addr; 257 *b=(const char *)((const MEM *)b_void)->addr;
320 if (ap==bp) return 0; 258 if (a==b) return 0;
321 else if (ap>bp) return 1; 259 else if (a>b) return 1;
322 else return -1; 260 else return -1;
323#else 261#else
324 return (const char *)a->addr - (const char *)b->addr; 262 return((const char *)((const MEM *)a_void)->addr
263 - (const char *)((const MEM *)b_void)->addr);
325#endif 264#endif
326 } 265 }
327static IMPLEMENT_LHASH_COMP_FN(mem, MEM)
328 266
329static unsigned long mem_hash(const MEM *a) 267/* static unsigned long mem_hash(MEM *a) */
268static unsigned long mem_hash(const void *a_void)
330 { 269 {
331 unsigned long ret; 270 unsigned long ret;
332 271
333 ret=(unsigned long)a->addr; 272 ret=(unsigned long)((const MEM *)a_void)->addr;
334 273
335 ret=ret*17851+(ret>>14)*7+(ret>>4)*251; 274 ret=ret*17851+(ret>>14)*7+(ret>>4)*251;
336 return(ret); 275 return(ret);
337 } 276 }
338static IMPLEMENT_LHASH_HASH_FN(mem, MEM)
339 277
340/* static int app_info_cmp(APP_INFO *a, APP_INFO *b) */ 278/* static int app_info_cmp(APP_INFO *a, APP_INFO *b) */
341static int app_info_cmp(const void *a_void, const void *b_void) 279static int app_info_cmp(const void *a_void, const void *b_void)
342 { 280 {
343 return CRYPTO_THREADID_cmp(&((const APP_INFO *)a_void)->threadid, 281 return(((const APP_INFO *)a_void)->thread
344 &((const APP_INFO *)b_void)->threadid); 282 != ((const APP_INFO *)b_void)->thread);
345 } 283 }
346static IMPLEMENT_LHASH_COMP_FN(app_info, APP_INFO)
347 284
348static unsigned long app_info_hash(const APP_INFO *a) 285/* static unsigned long app_info_hash(APP_INFO *a) */
286static unsigned long app_info_hash(const void *a_void)
349 { 287 {
350 unsigned long ret; 288 unsigned long ret;
351 289
352 ret = CRYPTO_THREADID_hash(&a->threadid); 290 ret=(unsigned long)((const APP_INFO *)a_void)->thread;
353 /* This is left in as a "who am I to question legacy?" measure */ 291
354 ret=ret*17851+(ret>>14)*7+(ret>>4)*251; 292 ret=ret*17851+(ret>>14)*7+(ret>>4)*251;
355 return(ret); 293 return(ret);
356 } 294 }
357static IMPLEMENT_LHASH_HASH_FN(app_info, APP_INFO)
358 295
359static APP_INFO *pop_info(void) 296static APP_INFO *pop_info(void)
360 { 297 {
@@ -363,22 +300,21 @@ static APP_INFO *pop_info(void)
363 300
364 if (amih != NULL) 301 if (amih != NULL)
365 { 302 {
366 CRYPTO_THREADID_current(&tmp.threadid); 303 tmp.thread=CRYPTO_thread_id();
367 if ((ret=lh_APP_INFO_delete(amih,&tmp)) != NULL) 304 if ((ret=(APP_INFO *)lh_delete(amih,&tmp)) != NULL)
368 { 305 {
369 APP_INFO *next=ret->next; 306 APP_INFO *next=ret->next;
370 307
371 if (next != NULL) 308 if (next != NULL)
372 { 309 {
373 next->references++; 310 next->references++;
374 (void)lh_APP_INFO_insert(amih,next); 311 lh_insert(amih,(char *)next);
375 } 312 }
376#ifdef LEVITTE_DEBUG_MEM 313#ifdef LEVITTE_DEBUG_MEM
377 if (CRYPTO_THREADID_cmp(&ret->threadid, &tmp.threadid)) 314 if (ret->thread != tmp.thread)
378 { 315 {
379 fprintf(stderr, "pop_info(): deleted info has other thread ID (%lu) than the current thread (%lu)!!!!\n", 316 fprintf(stderr, "pop_info(): deleted info has other thread ID (%lu) than the current thread (%lu)!!!!\n",
380 CRYPTO_THREADID_hash(&ret->threadid), 317 ret->thread, tmp.thread);
381 CRYPTO_THREADID_hash(&tmp.threadid));
382 abort(); 318 abort();
383 } 319 }
384#endif 320#endif
@@ -394,7 +330,7 @@ static APP_INFO *pop_info(void)
394 return(ret); 330 return(ret);
395 } 331 }
396 332
397int CRYPTO_push_info_(const char *info, const char *file, int line) 333int CRYPTO_dbg_push_info(const char *info, const char *file, int line)
398 { 334 {
399 APP_INFO *ami, *amim; 335 APP_INFO *ami, *amim;
400 int ret=0; 336 int ret=0;
@@ -410,7 +346,7 @@ int CRYPTO_push_info_(const char *info, const char *file, int line)
410 } 346 }
411 if (amih == NULL) 347 if (amih == NULL)
412 { 348 {
413 if ((amih=lh_APP_INFO_new()) == NULL) 349 if ((amih=lh_new(app_info_hash, app_info_cmp)) == NULL)
414 { 350 {
415 OPENSSL_free(ami); 351 OPENSSL_free(ami);
416 ret=0; 352 ret=0;
@@ -418,21 +354,20 @@ int CRYPTO_push_info_(const char *info, const char *file, int line)
418 } 354 }
419 } 355 }
420 356
421 CRYPTO_THREADID_current(&ami->threadid); 357 ami->thread=CRYPTO_thread_id();
422 ami->file=file; 358 ami->file=file;
423 ami->line=line; 359 ami->line=line;
424 ami->info=info; 360 ami->info=info;
425 ami->references=1; 361 ami->references=1;
426 ami->next=NULL; 362 ami->next=NULL;
427 363
428 if ((amim=lh_APP_INFO_insert(amih,ami)) != NULL) 364 if ((amim=(APP_INFO *)lh_insert(amih,(char *)ami)) != NULL)
429 { 365 {
430#ifdef LEVITTE_DEBUG_MEM 366#ifdef LEVITTE_DEBUG_MEM
431 if (CRYPTO_THREADID_cmp(&ami->threadid, &amim->threadid)) 367 if (ami->thread != amim->thread)
432 { 368 {
433 fprintf(stderr, "CRYPTO_push_info(): previous info has other thread ID (%lu) than the current thread (%lu)!!!!\n", 369 fprintf(stderr, "CRYPTO_push_info(): previous info has other thread ID (%lu) than the current thread (%lu)!!!!\n",
434 CRYPTO_THREADID_hash(&amim->threadid), 370 amim->thread, ami->thread);
435 CRYPTO_THREADID_hash(&ami->threadid));
436 abort(); 371 abort();
437 } 372 }
438#endif 373#endif
@@ -445,7 +380,7 @@ int CRYPTO_push_info_(const char *info, const char *file, int line)
445 return(ret); 380 return(ret);
446 } 381 }
447 382
448int CRYPTO_pop_info(void) 383int CRYPTO_dbg_pop_info(void)
449 { 384 {
450 int ret=0; 385 int ret=0;
451 386
@@ -460,7 +395,7 @@ int CRYPTO_pop_info(void)
460 return(ret); 395 return(ret);
461 } 396 }
462 397
463int CRYPTO_remove_all_info(void) 398int CRYPTO_dbg_remove_all_info(void)
464 { 399 {
465 int ret=0; 400 int ret=0;
466 401
@@ -504,7 +439,7 @@ void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line,
504 } 439 }
505 if (mh == NULL) 440 if (mh == NULL)
506 { 441 {
507 if ((mh=lh_MEM_new()) == NULL) 442 if ((mh=lh_new(mem_hash, mem_cmp)) == NULL)
508 { 443 {
509 OPENSSL_free(addr); 444 OPENSSL_free(addr);
510 OPENSSL_free(m); 445 OPENSSL_free(m);
@@ -518,9 +453,9 @@ void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line,
518 m->line=line; 453 m->line=line;
519 m->num=num; 454 m->num=num;
520 if (options & V_CRYPTO_MDEBUG_THREAD) 455 if (options & V_CRYPTO_MDEBUG_THREAD)
521 CRYPTO_THREADID_current(&m->threadid); 456 m->thread=CRYPTO_thread_id();
522 else 457 else
523 memset(&m->threadid, 0, sizeof(m->threadid)); 458 m->thread=0;
524 459
525 if (order == break_order_num) 460 if (order == break_order_num)
526 { 461 {
@@ -529,7 +464,7 @@ void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line,
529 } 464 }
530 m->order=order++; 465 m->order=order++;
531#ifdef LEVITTE_DEBUG_MEM 466#ifdef LEVITTE_DEBUG_MEM
532 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] %c 0x%p (%d)\n", 467 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5d] %c 0x%p (%d)\n",
533 m->order, 468 m->order,
534 (before_p & 128) ? '*' : '+', 469 (before_p & 128) ? '*' : '+',
535 m->addr, m->num); 470 m->addr, m->num);
@@ -539,16 +474,16 @@ void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line,
539 else 474 else
540 m->time=0; 475 m->time=0;
541 476
542 CRYPTO_THREADID_current(&tmp.threadid); 477 tmp.thread=CRYPTO_thread_id();
543 m->app_info=NULL; 478 m->app_info=NULL;
544 if (amih != NULL 479 if (amih != NULL
545 && (amim=lh_APP_INFO_retrieve(amih,&tmp)) != NULL) 480 && (amim=(APP_INFO *)lh_retrieve(amih,(char *)&tmp)) != NULL)
546 { 481 {
547 m->app_info = amim; 482 m->app_info = amim;
548 amim->references++; 483 amim->references++;
549 } 484 }
550 485
551 if ((mm=lh_MEM_insert(mh, m)) != NULL) 486 if ((mm=(MEM *)lh_insert(mh,(char *)m)) != NULL)
552 { 487 {
553 /* Not good, but don't sweat it */ 488 /* Not good, but don't sweat it */
554 if (mm->app_info != NULL) 489 if (mm->app_info != NULL)
@@ -581,11 +516,11 @@ void CRYPTO_dbg_free(void *addr, int before_p)
581 MemCheck_off(); /* make sure we hold MALLOC2 lock */ 516 MemCheck_off(); /* make sure we hold MALLOC2 lock */
582 517
583 m.addr=addr; 518 m.addr=addr;
584 mp=lh_MEM_delete(mh,&m); 519 mp=(MEM *)lh_delete(mh,(char *)&m);
585 if (mp != NULL) 520 if (mp != NULL)
586 { 521 {
587#ifdef LEVITTE_DEBUG_MEM 522#ifdef LEVITTE_DEBUG_MEM
588 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] - 0x%p (%d)\n", 523 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5d] - 0x%p (%d)\n",
589 mp->order, mp->addr, mp->num); 524 mp->order, mp->addr, mp->num);
590#endif 525#endif
591 if (mp->app_info != NULL) 526 if (mp->app_info != NULL)
@@ -631,18 +566,18 @@ void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num,
631 MemCheck_off(); /* make sure we hold MALLOC2 lock */ 566 MemCheck_off(); /* make sure we hold MALLOC2 lock */
632 567
633 m.addr=addr1; 568 m.addr=addr1;
634 mp=lh_MEM_delete(mh,&m); 569 mp=(MEM *)lh_delete(mh,(char *)&m);
635 if (mp != NULL) 570 if (mp != NULL)
636 { 571 {
637#ifdef LEVITTE_DEBUG_MEM 572#ifdef LEVITTE_DEBUG_MEM
638 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] * 0x%p (%d) -> 0x%p (%d)\n", 573 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5d] * 0x%p (%d) -> 0x%p (%d)\n",
639 mp->order, 574 mp->order,
640 mp->addr, mp->num, 575 mp->addr, mp->num,
641 addr2, num); 576 addr2, num);
642#endif 577#endif
643 mp->addr=addr2; 578 mp->addr=addr2;
644 mp->num=num; 579 mp->num=num;
645 (void)lh_MEM_insert(mh,mp); 580 lh_insert(mh,(char *)mp);
646 } 581 }
647 582
648 MemCheck_on(); /* release MALLOC2 lock 583 MemCheck_on(); /* release MALLOC2 lock
@@ -661,14 +596,14 @@ typedef struct mem_leak_st
661 long bytes; 596 long bytes;
662 } MEM_LEAK; 597 } MEM_LEAK;
663 598
664static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l) 599static void print_leak(const MEM *m, MEM_LEAK *l)
665 { 600 {
666 char buf[1024]; 601 char buf[1024];
667 char *bufp = buf; 602 char *bufp = buf;
668 APP_INFO *amip; 603 APP_INFO *amip;
669 int ami_cnt; 604 int ami_cnt;
670 struct tm *lcl = NULL; 605 struct tm *lcl = NULL;
671 CRYPTO_THREADID ti; 606 unsigned long ti;
672 607
673#define BUF_REMAIN (sizeof buf - (size_t)(bufp - buf)) 608#define BUF_REMAIN (sizeof buf - (size_t)(bufp - buf))
674 609
@@ -690,8 +625,7 @@ static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l)
690 625
691 if (options & V_CRYPTO_MDEBUG_THREAD) 626 if (options & V_CRYPTO_MDEBUG_THREAD)
692 { 627 {
693 BIO_snprintf(bufp, BUF_REMAIN, "thread=%lu, ", 628 BIO_snprintf(bufp, BUF_REMAIN, "thread=%lu, ", m->thread);
694 CRYPTO_THREADID_hash(&m->threadid));
695 bufp += strlen(bufp); 629 bufp += strlen(bufp);
696 } 630 }
697 631
@@ -708,8 +642,8 @@ static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l)
708 ami_cnt=0; 642 ami_cnt=0;
709 if (!amip) 643 if (!amip)
710 return; 644 return;
711 CRYPTO_THREADID_cpy(&ti, &amip->threadid); 645 ti=amip->thread;
712 646
713 do 647 do
714 { 648 {
715 int buf_len; 649 int buf_len;
@@ -719,8 +653,7 @@ static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l)
719 memset(buf,'>',ami_cnt); 653 memset(buf,'>',ami_cnt);
720 BIO_snprintf(buf + ami_cnt, sizeof buf - ami_cnt, 654 BIO_snprintf(buf + ami_cnt, sizeof buf - ami_cnt,
721 " thread=%lu, file=%s, line=%d, info=\"", 655 " thread=%lu, file=%s, line=%d, info=\"",
722 CRYPTO_THREADID_hash(&amip->threadid), amip->file, 656 amip->thread, amip->file, amip->line);
723 amip->line);
724 buf_len=strlen(buf); 657 buf_len=strlen(buf);
725 info_len=strlen(amip->info); 658 info_len=strlen(amip->info);
726 if (128 - buf_len - 3 < info_len) 659 if (128 - buf_len - 3 < info_len)
@@ -740,8 +673,8 @@ static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l)
740 673
741 amip = amip->next; 674 amip = amip->next;
742 } 675 }
743 while(amip && !CRYPTO_THREADID_cmp(&amip->threadid, &ti)); 676 while(amip && amip->thread == ti);
744 677
745#ifdef LEVITTE_DEBUG_MEM 678#ifdef LEVITTE_DEBUG_MEM
746 if (amip) 679 if (amip)
747 { 680 {
@@ -751,7 +684,7 @@ static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l)
751#endif 684#endif
752 } 685 }
753 686
754static IMPLEMENT_LHASH_DOALL_ARG_FN(print_leak, const MEM, MEM_LEAK) 687static IMPLEMENT_LHASH_DOALL_ARG_FN(print_leak, const MEM *, MEM_LEAK *)
755 688
756void CRYPTO_mem_leaks(BIO *b) 689void CRYPTO_mem_leaks(BIO *b)
757 { 690 {
@@ -766,15 +699,12 @@ void CRYPTO_mem_leaks(BIO *b)
766 ml.bytes=0; 699 ml.bytes=0;
767 ml.chunks=0; 700 ml.chunks=0;
768 if (mh != NULL) 701 if (mh != NULL)
769 lh_MEM_doall_arg(mh, LHASH_DOALL_ARG_FN(print_leak), MEM_LEAK, 702 lh_doall_arg(mh, LHASH_DOALL_ARG_FN(print_leak),
770 &ml); 703 (char *)&ml);
771 if (ml.chunks != 0) 704 if (ml.chunks != 0)
772 { 705 {
773 BIO_printf(b,"%ld bytes leaked in %d chunks\n", 706 BIO_printf(b,"%ld bytes leaked in %d chunks\n",
774 ml.bytes,ml.chunks); 707 ml.bytes,ml.chunks);
775#ifdef CRYPTO_MDEBUG_ABORT
776 abort();
777#endif
778 } 708 }
779 else 709 else
780 { 710 {
@@ -787,7 +717,7 @@ void CRYPTO_mem_leaks(BIO *b)
787 * XXX This should be in CRYPTO_mem_leaks_cb, 717 * XXX This should be in CRYPTO_mem_leaks_cb,
788 * and CRYPTO_mem_leaks should be implemented by 718 * and CRYPTO_mem_leaks should be implemented by
789 * using CRYPTO_mem_leaks_cb. 719 * using CRYPTO_mem_leaks_cb.
790 * (Also there should be a variant of lh_doall_arg 720 * (Also their should be a variant of lh_doall_arg
791 * that takes a function pointer instead of a void *; 721 * that takes a function pointer instead of a void *;
792 * this would obviate the ugly and illegal 722 * this would obviate the ugly and illegal
793 * void_fn_to_char kludge in CRYPTO_mem_leaks_cb. 723 * void_fn_to_char kludge in CRYPTO_mem_leaks_cb.
@@ -804,14 +734,14 @@ void CRYPTO_mem_leaks(BIO *b)
804 734
805 if (mh != NULL) 735 if (mh != NULL)
806 { 736 {
807 lh_MEM_free(mh); 737 lh_free(mh);
808 mh = NULL; 738 mh = NULL;
809 } 739 }
810 if (amih != NULL) 740 if (amih != NULL)
811 { 741 {
812 if (lh_APP_INFO_num_items(amih) == 0) 742 if (lh_num_items(amih) == 0)
813 { 743 {
814 lh_APP_INFO_free(amih); 744 lh_free(amih);
815 amih = NULL; 745 amih = NULL;
816 } 746 }
817 } 747 }
@@ -849,26 +779,40 @@ void CRYPTO_mem_leaks_fp(FILE *fp)
849/* NB: The prototypes have been typedef'd to CRYPTO_MEM_LEAK_CB inside crypto.h 779/* NB: The prototypes have been typedef'd to CRYPTO_MEM_LEAK_CB inside crypto.h
850 * If this code is restructured, remove the callback type if it is no longer 780 * If this code is restructured, remove the callback type if it is no longer
851 * needed. -- Geoff Thorpe */ 781 * needed. -- Geoff Thorpe */
852 782static void cb_leak(const MEM *m, CRYPTO_MEM_LEAK_CB **cb)
853/* Can't pass CRYPTO_MEM_LEAK_CB directly to lh_MEM_doall_arg because it
854 * is a function pointer and conversion to void * is prohibited. Instead
855 * pass its address
856 */
857
858typedef CRYPTO_MEM_LEAK_CB *PCRYPTO_MEM_LEAK_CB;
859
860static void cb_leak_doall_arg(const MEM *m, PCRYPTO_MEM_LEAK_CB *cb)
861 { 783 {
862 (*cb)(m->order,m->file,m->line,m->num,m->addr); 784 (**cb)(m->order,m->file,m->line,m->num,m->addr);
863 } 785 }
864 786
865static IMPLEMENT_LHASH_DOALL_ARG_FN(cb_leak, const MEM, PCRYPTO_MEM_LEAK_CB) 787static IMPLEMENT_LHASH_DOALL_ARG_FN(cb_leak, const MEM *, CRYPTO_MEM_LEAK_CB **)
866 788
867void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb) 789void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb)
868 { 790 {
869 if (mh == NULL) return; 791 if (mh == NULL) return;
870 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2); 792 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2);
871 lh_MEM_doall_arg(mh, LHASH_DOALL_ARG_FN(cb_leak), PCRYPTO_MEM_LEAK_CB, 793 lh_doall_arg(mh, LHASH_DOALL_ARG_FN(cb_leak), &cb);
872 &cb);
873 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2); 794 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2);
874 } 795 }
796
797void CRYPTO_malloc_debug_init(void)
798 {
799 CRYPTO_set_mem_debug_functions(
800 CRYPTO_dbg_malloc,
801 CRYPTO_dbg_realloc,
802 CRYPTO_dbg_free,
803 CRYPTO_dbg_set_options,
804 CRYPTO_dbg_get_options);
805 CRYPTO_set_mem_info_functions(
806 CRYPTO_dbg_push_info,
807 CRYPTO_dbg_pop_info,
808 CRYPTO_dbg_remove_all_info);
809 }
810
811char *CRYPTO_strdup(const char *str, const char *file, int line)
812 {
813 size_t len = strlen(str)+1;
814 char *ret = CRYPTO_malloc(len, file, line);
815
816 memcpy(ret, str, len);
817 return ret;
818 }