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