diff options
Diffstat (limited to 'src/lib/libcrypto/mem_dbg.c')
-rw-r--r-- | src/lib/libcrypto/mem_dbg.c | 258 |
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 | ||
136 | static unsigned long order = 0; /* number of memory requests */ | 83 | static unsigned long order = 0; /* number of memory requests */ |
137 | 84 | static LHASH *mh=NULL; /* hash-table of memory requests (address as key); | |
138 | DECLARE_LHASH_OF(MEM); | 85 | * access requires MALLOC2 lock */ |
139 | static LHASH_OF(MEM) *mh=NULL; /* hash-table of memory requests | ||
140 | * (address as key); access requires | ||
141 | * MALLOC2 lock */ | ||
142 | 86 | ||
143 | 87 | ||
144 | typedef struct app_mem_info_st | 88 | typedef 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 | ||
161 | static void app_info_free(APP_INFO *); | 105 | static void app_info_free(APP_INFO *); |
162 | 106 | ||
163 | DECLARE_LHASH_OF(APP_INFO); | 107 | static LHASH *amih=NULL; /* hash-table with those app_mem_info_st's |
164 | static 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 | ||
171 | typedef struct mem_st | 112 | typedef 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 | 139 | static 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). |
202 | static CRYPTO_THREADID disabling_threadid; | 143 | */ |
203 | 144 | ||
204 | static void app_info_free(APP_INFO *inf) | 145 | static 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 | ||
315 | static int mem_cmp(const MEM *a, const MEM *b) | 252 | /* static int mem_cmp(MEM *a, MEM *b) */ |
253 | static 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 | } |
327 | static IMPLEMENT_LHASH_COMP_FN(mem, MEM) | ||
328 | 266 | ||
329 | static unsigned long mem_hash(const MEM *a) | 267 | /* static unsigned long mem_hash(MEM *a) */ |
268 | static 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 | } |
338 | static 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) */ |
341 | static int app_info_cmp(const void *a_void, const void *b_void) | 279 | static 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 | } |
346 | static IMPLEMENT_LHASH_COMP_FN(app_info, APP_INFO) | ||
347 | 284 | ||
348 | static unsigned long app_info_hash(const APP_INFO *a) | 285 | /* static unsigned long app_info_hash(APP_INFO *a) */ |
286 | static 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 | } |
357 | static IMPLEMENT_LHASH_HASH_FN(app_info, APP_INFO) | ||
358 | 295 | ||
359 | static APP_INFO *pop_info(void) | 296 | static 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 | ||
397 | int CRYPTO_push_info_(const char *info, const char *file, int line) | 333 | int 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 | ||
448 | int CRYPTO_pop_info(void) | 383 | int 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 | ||
463 | int CRYPTO_remove_all_info(void) | 398 | int 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 | ||
664 | static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l) | 599 | static 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 | ||
754 | static IMPLEMENT_LHASH_DOALL_ARG_FN(print_leak, const MEM, MEM_LEAK) | 687 | static IMPLEMENT_LHASH_DOALL_ARG_FN(print_leak, const MEM *, MEM_LEAK *) |
755 | 688 | ||
756 | void CRYPTO_mem_leaks(BIO *b) | 689 | void 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 | 782 | static 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 | |||
858 | typedef CRYPTO_MEM_LEAK_CB *PCRYPTO_MEM_LEAK_CB; | ||
859 | |||
860 | static 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 | ||
865 | static IMPLEMENT_LHASH_DOALL_ARG_FN(cb_leak, const MEM, PCRYPTO_MEM_LEAK_CB) | 787 | static IMPLEMENT_LHASH_DOALL_ARG_FN(cb_leak, const MEM *, CRYPTO_MEM_LEAK_CB **) |
866 | 788 | ||
867 | void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb) | 789 | void 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 | |||
797 | void 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 | |||
811 | char *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 | } | ||