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.c643
1 files changed, 312 insertions, 331 deletions
diff --git a/src/lib/libcrypto/mem_dbg.c b/src/lib/libcrypto/mem_dbg.c
index ac793397f1..9324ec4c7d 100644
--- a/src/lib/libcrypto/mem_dbg.c
+++ b/src/lib/libcrypto/mem_dbg.c
@@ -118,7 +118,7 @@
118#include <openssl/bio.h> 118#include <openssl/bio.h>
119#include <openssl/lhash.h> 119#include <openssl/lhash.h>
120 120
121static int mh_mode=CRYPTO_MEM_CHECK_OFF; 121static int mh_mode = CRYPTO_MEM_CHECK_OFF;
122/* The state changes to CRYPTO_MEM_CHECK_ON | CRYPTO_MEM_CHECK_ENABLE 122/* The state changes to CRYPTO_MEM_CHECK_ON | CRYPTO_MEM_CHECK_ENABLE
123 * when the application asks for it (usually after library initialisation 123 * when the application asks for it (usually after library initialisation
124 * for which no book-keeping is desired). 124 * for which no book-keeping is desired).
@@ -136,10 +136,9 @@ static int mh_mode=CRYPTO_MEM_CHECK_OFF;
136static unsigned long order = 0; /* number of memory requests */ 136static unsigned long order = 0; /* number of memory requests */
137 137
138DECLARE_LHASH_OF(MEM); 138DECLARE_LHASH_OF(MEM);
139static LHASH_OF(MEM) *mh=NULL; /* hash-table of memory requests 139static LHASH_OF(MEM) *mh = NULL; /* hash - table of memory requests
140 * (address as key); access requires 140 * (address as key); access requires
141 * MALLOC2 lock */ 141 * MALLOC2 lock */
142
143 142
144typedef struct app_mem_info_st 143typedef struct app_mem_info_st
145/* For application-defined information (static C-string `info') 144/* For application-defined information (static C-string `info')
@@ -149,28 +148,28 @@ typedef struct app_mem_info_st
149 * CRYPTO_pop_info() to pop an entry, 148 * CRYPTO_pop_info() to pop an entry,
150 * CRYPTO_remove_all_info() to pop all entries. 149 * CRYPTO_remove_all_info() to pop all entries.
151 */ 150 */
152 { 151{
153 CRYPTO_THREADID threadid; 152 CRYPTO_THREADID threadid;
154 const char *file; 153 const char *file;
155 int line; 154 int line;
156 const char *info; 155 const char *info;
157 struct app_mem_info_st *next; /* tail of thread's stack */ 156 struct app_mem_info_st *next; /* tail of thread's stack */
158 int references; 157 int references;
159 } APP_INFO; 158} APP_INFO;
160 159
161static void app_info_free(APP_INFO *); 160static void app_info_free(APP_INFO *);
162 161
163DECLARE_LHASH_OF(APP_INFO); 162DECLARE_LHASH_OF(APP_INFO);
164static LHASH_OF(APP_INFO) *amih=NULL; /* hash-table with those 163static LHASH_OF(APP_INFO) *amih = NULL; /* hash - table with those
165 * app_mem_info_st's that are at 164 * app_mem_info_st's that are at
166 * the top of their thread's 165 * the top of their thread's
167 * stack (with `thread' as key); 166 * stack (with `thread' as key);
168 * access requires MALLOC2 167 * access requires MALLOC2
169 * lock */ 168 * lock */
170 169
171typedef struct mem_st 170typedef struct mem_st
172/* memory-block description */ 171/* memory-block description */
173 { 172{
174 void *addr; 173 void *addr;
175 int num; 174 int num;
176 const char *file; 175 const char *file;
@@ -179,47 +178,46 @@ typedef struct mem_st
179 unsigned long order; 178 unsigned long order;
180 time_t time; 179 time_t time;
181 APP_INFO *app_info; 180 APP_INFO *app_info;
182 } MEM; 181} MEM;
183 182
184static long options = /* extra information to be recorded */ 183static long options = /* extra information to be recorded */
185#if defined(CRYPTO_MDEBUG_TIME) || defined(CRYPTO_MDEBUG_ALL) 184#if defined(CRYPTO_MDEBUG_TIME) || defined(CRYPTO_MDEBUG_ALL)
186 V_CRYPTO_MDEBUG_TIME | 185V_CRYPTO_MDEBUG_TIME |
187#endif 186#endif
188#if defined(CRYPTO_MDEBUG_THREAD) || defined(CRYPTO_MDEBUG_ALL) 187#if defined(CRYPTO_MDEBUG_THREAD) || defined(CRYPTO_MDEBUG_ALL)
189 V_CRYPTO_MDEBUG_THREAD | 188V_CRYPTO_MDEBUG_THREAD |
190#endif 189#endif
191 0; 1900;
192 191
193 192
194static unsigned int num_disable = 0; /* num_disable > 0 193static unsigned int num_disable = 0; /* num_disable > 0
195 * iff 194 * iff
196 * mh_mode == CRYPTO_MEM_CHECK_ON (w/o ..._ENABLE) 195 * mh_mode == CRYPTO_MEM_CHECK_ON (w/o ..._ENABLE)
197 */ 196 */
198 197
199/* Valid iff num_disable > 0. CRYPTO_LOCK_MALLOC2 is locked exactly in this 198/* Valid iff num_disable > 0. CRYPTO_LOCK_MALLOC2 is locked exactly in this
200 * case (by the thread named in disabling_thread). 199 * case (by the thread named in disabling_thread).
201 */ 200 */
202static CRYPTO_THREADID disabling_threadid; 201static CRYPTO_THREADID disabling_threadid;
203 202
204static void app_info_free(APP_INFO *inf) 203static void
205 { 204app_info_free(APP_INFO *inf)
206 if (--(inf->references) <= 0) 205{
207 { 206 if (--(inf->references) <= 0) {
208 if (inf->next != NULL) 207 if (inf->next != NULL) {
209 {
210 app_info_free(inf->next); 208 app_info_free(inf->next);
211 }
212 OPENSSL_free(inf);
213 } 209 }
210 OPENSSL_free(inf);
214 } 211 }
212}
215 213
216int CRYPTO_mem_ctrl(int mode) 214int
217 { 215CRYPTO_mem_ctrl(int mode)
218 int ret=mh_mode; 216{
217 int ret = mh_mode;
219 218
220 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC); 219 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
221 switch (mode) 220 switch (mode) {
222 {
223 /* for applications (not to be called while multiple threads 221 /* for applications (not to be called while multiple threads
224 * use the library): */ 222 * use the library): */
225 case CRYPTO_MEM_CHECK_ON: /* aka MemCheck_start() */ 223 case CRYPTO_MEM_CHECK_ON: /* aka MemCheck_start() */
@@ -232,14 +230,13 @@ int CRYPTO_mem_ctrl(int mode)
232 or there'll be a lot of confusion */ 230 or there'll be a lot of confusion */
233 break; 231 break;
234 232
235 /* switch off temporarily (for library-internal use): */ 233 /* switch off temporarily (for library-internal use): */
236 case CRYPTO_MEM_CHECK_DISABLE: /* aka MemCheck_off() */ 234 case CRYPTO_MEM_CHECK_DISABLE: /* aka MemCheck_off() */
237 if (mh_mode & CRYPTO_MEM_CHECK_ON) 235 if (mh_mode & CRYPTO_MEM_CHECK_ON) {
238 {
239 CRYPTO_THREADID cur; 236 CRYPTO_THREADID cur;
240 CRYPTO_THREADID_current(&cur); 237 CRYPTO_THREADID_current(&cur);
241 if (!num_disable || CRYPTO_THREADID_cmp(&disabling_threadid, &cur)) /* otherwise we already have the MALLOC2 lock */ 238 if (!num_disable || CRYPTO_THREADID_cmp(&disabling_threadid, &cur)) /* otherwise we already have the MALLOC2 lock */
242 { 239 {
243 /* Long-time lock CRYPTO_LOCK_MALLOC2 must not be claimed while 240 /* Long-time lock CRYPTO_LOCK_MALLOC2 must not be claimed while
244 * we're holding CRYPTO_LOCK_MALLOC, or we'll deadlock if 241 * we're holding CRYPTO_LOCK_MALLOC, or we'll deadlock if
245 * somebody else holds CRYPTO_LOCK_MALLOC2 (and cannot release 242 * somebody else holds CRYPTO_LOCK_MALLOC2 (and cannot release
@@ -257,412 +254,402 @@ int CRYPTO_mem_ctrl(int mode)
257 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC); 254 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
258 mh_mode &= ~CRYPTO_MEM_CHECK_ENABLE; 255 mh_mode &= ~CRYPTO_MEM_CHECK_ENABLE;
259 CRYPTO_THREADID_cpy(&disabling_threadid, &cur); 256 CRYPTO_THREADID_cpy(&disabling_threadid, &cur);
260 }
261 num_disable++;
262 } 257 }
258 num_disable++;
259 }
263 break; 260 break;
264 case CRYPTO_MEM_CHECK_ENABLE: /* aka MemCheck_on() */ 261 case CRYPTO_MEM_CHECK_ENABLE: /* aka MemCheck_on() */
265 if (mh_mode & CRYPTO_MEM_CHECK_ON) 262 if (mh_mode & CRYPTO_MEM_CHECK_ON) {
266 {
267 if (num_disable) /* always true, or something is going wrong */ 263 if (num_disable) /* always true, or something is going wrong */
268 { 264 {
269 num_disable--; 265 num_disable--;
270 if (num_disable == 0) 266 if (num_disable == 0) {
271 {
272 mh_mode|=CRYPTO_MEM_CHECK_ENABLE; 267 mh_mode|=CRYPTO_MEM_CHECK_ENABLE;
273 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2); 268 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2);
274 }
275 } 269 }
276 } 270 }
271 }
277 break; 272 break;
278 273
279 default: 274 default:
280 break; 275 break;
281 }
282 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
283 return(ret);
284 } 276 }
277 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
278 return (ret);
279}
285 280
286int CRYPTO_is_mem_check_on(void) 281int
287 { 282CRYPTO_is_mem_check_on(void)
283{
288 int ret = 0; 284 int ret = 0;
289 285
290 if (mh_mode & CRYPTO_MEM_CHECK_ON) 286 if (mh_mode & CRYPTO_MEM_CHECK_ON) {
291 {
292 CRYPTO_THREADID cur; 287 CRYPTO_THREADID cur;
293 CRYPTO_THREADID_current(&cur); 288 CRYPTO_THREADID_current(&cur);
294 CRYPTO_r_lock(CRYPTO_LOCK_MALLOC); 289 CRYPTO_r_lock(CRYPTO_LOCK_MALLOC);
295 290
296 ret = (mh_mode & CRYPTO_MEM_CHECK_ENABLE) 291 ret = (mh_mode & CRYPTO_MEM_CHECK_ENABLE) ||
297 || CRYPTO_THREADID_cmp(&disabling_threadid, &cur); 292 CRYPTO_THREADID_cmp(&disabling_threadid, &cur);
298 293
299 CRYPTO_r_unlock(CRYPTO_LOCK_MALLOC); 294 CRYPTO_r_unlock(CRYPTO_LOCK_MALLOC);
300 } 295 }
301 return(ret); 296 return (ret);
302 } 297}
303 298
304 299
305void CRYPTO_dbg_set_options(long bits) 300void
306 { 301CRYPTO_dbg_set_options(long bits)
302{
307 options = bits; 303 options = bits;
308 } 304}
309 305
310long CRYPTO_dbg_get_options(void) 306long
311 { 307CRYPTO_dbg_get_options(void)
308{
312 return options; 309 return options;
313 } 310}
314 311
315static int mem_cmp(const MEM *a, const MEM *b) 312static int
316 { 313mem_cmp(const MEM *a, const MEM *b)
314{
317#ifdef _WIN64 315#ifdef _WIN64
318 const char *ap=(const char *)a->addr, 316 const char *ap = (const char *)a->addr,
319 *bp=(const char *)b->addr; 317 *bp = (const char *)b->addr;
320 if (ap==bp) return 0; 318 if (ap == bp)
321 else if (ap>bp) return 1; 319 return 0;
322 else return -1; 320 else if (ap > bp) return 1;
321 else return -1;
323#else 322#else
324 return (const char *)a->addr - (const char *)b->addr; 323 return (const char *)a->addr - (const char *)b->addr;
325#endif 324#endif
326 } 325}
326
327static IMPLEMENT_LHASH_COMP_FN(mem, MEM) 327static IMPLEMENT_LHASH_COMP_FN(mem, MEM)
328 328
329static unsigned long mem_hash(const MEM *a) 329static unsigned long
330 { 330mem_hash(const MEM *a)
331{
331 unsigned long ret; 332 unsigned long ret;
332 333
333 ret=(unsigned long)a->addr; 334 ret = (unsigned long)a->addr;
334 335
335 ret=ret*17851+(ret>>14)*7+(ret>>4)*251; 336 ret = ret * 17851 + (ret >> 14) * 7 + (ret >> 4) * 251;
336 return(ret); 337 return (ret);
337 } 338}
338static IMPLEMENT_LHASH_HASH_FN(mem, MEM) 339
340static
341IMPLEMENT_LHASH_HASH_FN(mem, MEM)
339 342
340/* static int app_info_cmp(APP_INFO *a, APP_INFO *b) */ 343/* static int app_info_cmp(APP_INFO *a, APP_INFO *b) */
341static int app_info_cmp(const void *a_void, const void *b_void) 344static int
342 { 345app_info_cmp(const void *a_void, const void *b_void)
346{
343 return CRYPTO_THREADID_cmp(&((const APP_INFO *)a_void)->threadid, 347 return CRYPTO_THREADID_cmp(&((const APP_INFO *)a_void)->threadid,
344 &((const APP_INFO *)b_void)->threadid); 348 &((const APP_INFO *)b_void)->threadid);
345 } 349}
350
346static IMPLEMENT_LHASH_COMP_FN(app_info, APP_INFO) 351static IMPLEMENT_LHASH_COMP_FN(app_info, APP_INFO)
347 352
348static unsigned long app_info_hash(const APP_INFO *a) 353static unsigned long
349 { 354app_info_hash(const APP_INFO *a)
355{
350 unsigned long ret; 356 unsigned long ret;
351 357
352 ret = CRYPTO_THREADID_hash(&a->threadid); 358 ret = CRYPTO_THREADID_hash(&a->threadid);
353 /* This is left in as a "who am I to question legacy?" measure */ 359 /* This is left in as a "who am I to question legacy?" measure */
354 ret=ret*17851+(ret>>14)*7+(ret>>4)*251; 360 ret = ret * 17851 + (ret >> 14) * 7 + (ret >> 4) * 251;
355 return(ret); 361 return (ret);
356 } 362}
363
357static IMPLEMENT_LHASH_HASH_FN(app_info, APP_INFO) 364static IMPLEMENT_LHASH_HASH_FN(app_info, APP_INFO)
358 365
359static APP_INFO *pop_info(void) 366static APP_INFO
360 { 367*pop_info(void)
368{
361 APP_INFO tmp; 369 APP_INFO tmp;
362 APP_INFO *ret = NULL; 370 APP_INFO *ret = NULL;
363 371
364 if (amih != NULL) 372 if (amih != NULL) {
365 {
366 CRYPTO_THREADID_current(&tmp.threadid); 373 CRYPTO_THREADID_current(&tmp.threadid);
367 if ((ret=lh_APP_INFO_delete(amih,&tmp)) != NULL) 374 if ((ret = lh_APP_INFO_delete(amih, &tmp)) != NULL) {
368 { 375 APP_INFO *next = ret->next;
369 APP_INFO *next=ret->next;
370 376
371 if (next != NULL) 377 if (next != NULL) {
372 {
373 next->references++; 378 next->references++;
374 (void)lh_APP_INFO_insert(amih,next); 379 (void)lh_APP_INFO_insert(amih, next);
375 } 380 }
376#ifdef LEVITTE_DEBUG_MEM 381#ifdef LEVITTE_DEBUG_MEM
377 if (CRYPTO_THREADID_cmp(&ret->threadid, &tmp.threadid)) 382 if (CRYPTO_THREADID_cmp(&ret->threadid, &tmp.threadid)) {
378 {
379 fprintf(stderr, "pop_info(): deleted info has other thread ID (%lu) than the current thread (%lu)!!!!\n", 383 fprintf(stderr, "pop_info(): deleted info has other thread ID (%lu) than the current thread (%lu)!!!!\n",
380 CRYPTO_THREADID_hash(&ret->threadid), 384 CRYPTO_THREADID_hash(&ret->threadid),
381 CRYPTO_THREADID_hash(&tmp.threadid)); 385 CRYPTO_THREADID_hash(&tmp.threadid));
382 abort(); 386 abort();
383 } 387 }
384#endif 388#endif
385 if (--(ret->references) <= 0) 389 if (--(ret->references) <= 0) {
386 {
387 ret->next = NULL; 390 ret->next = NULL;
388 if (next != NULL) 391 if (next != NULL)
389 next->references--; 392 next->references--;
390 OPENSSL_free(ret); 393 OPENSSL_free(ret);
391 }
392 } 394 }
393 } 395 }
394 return(ret);
395 } 396 }
397 return (ret);
398}
396 399
397int CRYPTO_push_info_(const char *info, const char *file, int line) 400int
398 { 401CRYPTO_push_info_(const char *info, const char *file, int line)
402{
399 APP_INFO *ami, *amim; 403 APP_INFO *ami, *amim;
400 int ret=0; 404 int ret = 0;
401 405
402 if (is_MemCheck_on()) 406 if (is_MemCheck_on()) {
403 {
404 MemCheck_off(); /* obtain MALLOC2 lock */ 407 MemCheck_off(); /* obtain MALLOC2 lock */
405 408
406 if ((ami = (APP_INFO *)OPENSSL_malloc(sizeof(APP_INFO))) == NULL) 409 if ((ami = (APP_INFO *)OPENSSL_malloc(sizeof(APP_INFO))) == NULL) {
407 { 410 ret = 0;
408 ret=0;
409 goto err; 411 goto err;
410 } 412 }
411 if (amih == NULL) 413 if (amih == NULL) {
412 { 414 if ((amih = lh_APP_INFO_new()) == NULL) {
413 if ((amih=lh_APP_INFO_new()) == NULL)
414 {
415 OPENSSL_free(ami); 415 OPENSSL_free(ami);
416 ret=0; 416 ret = 0;
417 goto err; 417 goto err;
418 }
419 } 418 }
419 }
420 420
421 CRYPTO_THREADID_current(&ami->threadid); 421 CRYPTO_THREADID_current(&ami->threadid);
422 ami->file=file; 422 ami->file = file;
423 ami->line=line; 423 ami->line = line;
424 ami->info=info; 424 ami->info = info;
425 ami->references=1; 425 ami->references = 1;
426 ami->next=NULL; 426 ami->next = NULL;
427 427
428 if ((amim=lh_APP_INFO_insert(amih,ami)) != NULL) 428 if ((amim = lh_APP_INFO_insert(amih, ami)) != NULL) {
429 {
430#ifdef LEVITTE_DEBUG_MEM 429#ifdef LEVITTE_DEBUG_MEM
431 if (CRYPTO_THREADID_cmp(&ami->threadid, &amim->threadid)) 430 if (CRYPTO_THREADID_cmp(&ami->threadid, &amim->threadid)) {
432 {
433 fprintf(stderr, "CRYPTO_push_info(): previous info has other thread ID (%lu) than the current thread (%lu)!!!!\n", 431 fprintf(stderr, "CRYPTO_push_info(): previous info has other thread ID (%lu) than the current thread (%lu)!!!!\n",
434 CRYPTO_THREADID_hash(&amim->threadid), 432 CRYPTO_THREADID_hash(&amim->threadid),
435 CRYPTO_THREADID_hash(&ami->threadid)); 433 CRYPTO_THREADID_hash(&ami->threadid));
436 abort(); 434 abort();
437 }
438#endif
439 ami->next=amim;
440 } 435 }
441 err: 436#endif
442 MemCheck_on(); /* release MALLOC2 lock */ 437 ami->next = amim;
443 } 438 }
444 439 err:
445 return(ret); 440 MemCheck_on(); /* release MALLOC2 lock */
446 } 441 }
447 442
448int CRYPTO_pop_info(void) 443 return (ret);
449 { 444}
450 int ret=0; 445
446int
447CRYPTO_pop_info(void)
448{
449 int ret = 0;
451 450
452 if (is_MemCheck_on()) /* _must_ be true, or something went severely wrong */ 451 if (is_MemCheck_on()) /* _must_ be true, or something went severely wrong */
453 { 452 {
454 MemCheck_off(); /* obtain MALLOC2 lock */ 453 MemCheck_off(); /* obtain MALLOC2 lock */
455 454
456 ret=(pop_info() != NULL); 455 ret = (pop_info() != NULL);
457 456
458 MemCheck_on(); /* release MALLOC2 lock */ 457 MemCheck_on(); /* release MALLOC2 lock */
459 }
460 return(ret);
461 } 458 }
459 return (ret);
460}
462 461
463int CRYPTO_remove_all_info(void) 462int
464 { 463CRYPTO_remove_all_info(void)
465 int ret=0; 464{
465 int ret = 0;
466 466
467 if (is_MemCheck_on()) /* _must_ be true */ 467 if (is_MemCheck_on()) /* _must_ be true */
468 { 468 {
469 MemCheck_off(); /* obtain MALLOC2 lock */ 469 MemCheck_off(); /* obtain MALLOC2 lock */
470 470
471 while(pop_info() != NULL) 471 while (pop_info() != NULL)
472 ret++; 472 ret++;
473 473
474 MemCheck_on(); /* release MALLOC2 lock */ 474 MemCheck_on(); /* release MALLOC2 lock */
475 }
476 return(ret);
477 } 475 }
476 return (ret);
477}
478 478
479 479
480static unsigned long break_order_num=0; 480static unsigned long break_order_num = 0;
481void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line, 481void
482 int before_p) 482CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line,
483 { 483 int before_p)
484 MEM *m,*mm; 484{
485 APP_INFO tmp,*amim; 485 MEM *m, *mm;
486 APP_INFO tmp, *amim;
486 487
487 switch(before_p & 127) 488 switch (before_p & 127) {
488 {
489 case 0: 489 case 0:
490 break; 490 break;
491 case 1: 491 case 1:
492 if (addr == NULL) 492 if (addr == NULL)
493 break; 493 break;
494 494
495 if (is_MemCheck_on()) 495 if (is_MemCheck_on()) {
496 {
497 MemCheck_off(); /* make sure we hold MALLOC2 lock */ 496 MemCheck_off(); /* make sure we hold MALLOC2 lock */
498 if ((m=(MEM *)OPENSSL_malloc(sizeof(MEM))) == NULL) 497 if ((m = (MEM *)OPENSSL_malloc(sizeof(MEM))) == NULL) {
499 {
500 OPENSSL_free(addr); 498 OPENSSL_free(addr);
501 MemCheck_on(); /* release MALLOC2 lock 499 MemCheck_on(); /* release MALLOC2 lock
502 * if num_disabled drops to 0 */ 500 * if num_disabled drops to 0 */
503 return; 501 return;
504 } 502 }
505 if (mh == NULL) 503 if (mh == NULL) {
506 { 504 if ((mh = lh_MEM_new()) == NULL) {
507 if ((mh=lh_MEM_new()) == NULL)
508 {
509 OPENSSL_free(addr); 505 OPENSSL_free(addr);
510 OPENSSL_free(m); 506 OPENSSL_free(m);
511 addr=NULL; 507 addr = NULL;
512 goto err; 508 goto err;
513 }
514 } 509 }
510 }
515 511
516 m->addr=addr; 512 m->addr = addr;
517 m->file=file; 513 m->file = file;
518 m->line=line; 514 m->line = line;
519 m->num=num; 515 m->num = num;
520 if (options & V_CRYPTO_MDEBUG_THREAD) 516 if (options & V_CRYPTO_MDEBUG_THREAD)
521 CRYPTO_THREADID_current(&m->threadid); 517 CRYPTO_THREADID_current(&m->threadid);
522 else 518 else
523 memset(&m->threadid, 0, sizeof(m->threadid)); 519 memset(&m->threadid, 0, sizeof(m->threadid));
524 520
525 if (order == break_order_num) 521 if (order == break_order_num) {
526 {
527 /* BREAK HERE */ 522 /* BREAK HERE */
528 m->order=order; 523 m->order = order;
529 } 524 }
530 m->order=order++; 525 m->order = order++;
531#ifdef LEVITTE_DEBUG_MEM 526#ifdef LEVITTE_DEBUG_MEM
532 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] %c 0x%p (%d)\n", 527 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] %c 0x%p (%d)\n",
533 m->order, 528 m->order,
534 (before_p & 128) ? '*' : '+', 529 (before_p & 128) ? '*' : '+',
535 m->addr, m->num); 530 m->addr, m->num);
536#endif 531#endif
537 if (options & V_CRYPTO_MDEBUG_TIME) 532 if (options & V_CRYPTO_MDEBUG_TIME)
538 m->time=time(NULL); 533 m->time = time(NULL);
539 else 534 else
540 m->time=0; 535 m->time = 0;
541 536
542 CRYPTO_THREADID_current(&tmp.threadid); 537 CRYPTO_THREADID_current(&tmp.threadid);
543 m->app_info=NULL; 538 m->app_info = NULL;
544 if (amih != NULL 539 if (amih != NULL &&
545 && (amim=lh_APP_INFO_retrieve(amih,&tmp)) != NULL) 540 (amim = lh_APP_INFO_retrieve(amih, &tmp)) != NULL) {
546 {
547 m->app_info = amim; 541 m->app_info = amim;
548 amim->references++; 542 amim->references++;
549 } 543 }
550 544
551 if ((mm=lh_MEM_insert(mh, m)) != NULL) 545 if ((mm = lh_MEM_insert(mh, m)) != NULL) {
552 {
553 /* Not good, but don't sweat it */ 546 /* Not good, but don't sweat it */
554 if (mm->app_info != NULL) 547 if (mm->app_info != NULL) {
555 {
556 mm->app_info->references--; 548 mm->app_info->references--;
557 }
558 OPENSSL_free(mm);
559 } 549 }
560 err: 550 OPENSSL_free(mm);
551 }
552err:
561 MemCheck_on(); /* release MALLOC2 lock 553 MemCheck_on(); /* release MALLOC2 lock
562 * if num_disabled drops to 0 */ 554 * if num_disabled drops to 0 */
563 }
564 break;
565 } 555 }
566 return; 556 break;
567 } 557 }
558 return;
559}
568 560
569void CRYPTO_dbg_free(void *addr, int before_p) 561void
570 { 562CRYPTO_dbg_free(void *addr, int before_p)
571 MEM m,*mp; 563{
564 MEM m, *mp;
572 565
573 switch(before_p) 566 switch (before_p) {
574 {
575 case 0: 567 case 0:
576 if (addr == NULL) 568 if (addr == NULL)
577 break; 569 break;
578 570
579 if (is_MemCheck_on() && (mh != NULL)) 571 if (is_MemCheck_on() && (mh != NULL)) {
580 {
581 MemCheck_off(); /* make sure we hold MALLOC2 lock */ 572 MemCheck_off(); /* make sure we hold MALLOC2 lock */
582 573
583 m.addr=addr; 574 m.addr = addr;
584 mp=lh_MEM_delete(mh,&m); 575 mp = lh_MEM_delete(mh, &m);
585 if (mp != NULL) 576 if (mp != NULL) {
586 {
587#ifdef LEVITTE_DEBUG_MEM 577#ifdef LEVITTE_DEBUG_MEM
588 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] - 0x%p (%d)\n", 578 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] - 0x%p (%d)\n",
589 mp->order, mp->addr, mp->num); 579 mp->order, mp->addr, mp->num);
590#endif 580#endif
591 if (mp->app_info != NULL) 581 if (mp->app_info != NULL)
592 app_info_free(mp->app_info); 582 app_info_free(mp->app_info);
593 OPENSSL_free(mp); 583 OPENSSL_free(mp);
594 } 584 }
595 585
596 MemCheck_on(); /* release MALLOC2 lock 586 MemCheck_on(); /* release MALLOC2 lock
597 * if num_disabled drops to 0 */ 587 * if num_disabled drops to 0 */
598 } 588 }
599 break; 589 break;
600 case 1: 590 case 1:
601 break; 591 break;
602 }
603 } 592 }
593}
604 594
605void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num, 595void
606 const char *file, int line, int before_p) 596CRYPTO_dbg_realloc(void *addr1, void *addr2, int num,
607 { 597 const char *file, int line, int before_p)
608 MEM m,*mp; 598{
599 MEM m, *mp;
609 600
610#ifdef LEVITTE_DEBUG_MEM 601#ifdef LEVITTE_DEBUG_MEM
611 fprintf(stderr, "LEVITTE_DEBUG_MEM: --> CRYPTO_dbg_malloc(addr1 = %p, addr2 = %p, num = %d, file = \"%s\", line = %d, before_p = %d)\n", 602 fprintf(stderr, "LEVITTE_DEBUG_MEM: --> CRYPTO_dbg_malloc(addr1 = %p, addr2 = %p, num = %d, file = \"%s\", line = %d, before_p = %d)\n",
612 addr1, addr2, num, file, line, before_p); 603 addr1, addr2, num, file, line, before_p);
613#endif 604#endif
614 605
615 switch(before_p) 606 switch (before_p) {
616 {
617 case 0: 607 case 0:
618 break; 608 break;
619 case 1: 609 case 1:
620 if (addr2 == NULL) 610 if (addr2 == NULL)
621 break; 611 break;
622 612
623 if (addr1 == NULL) 613 if (addr1 == NULL) {
624 {
625 CRYPTO_dbg_malloc(addr2, num, file, line, 128 | before_p); 614 CRYPTO_dbg_malloc(addr2, num, file, line, 128 | before_p);
626 break; 615 break;
627 } 616 }
628 617
629 if (is_MemCheck_on()) 618 if (is_MemCheck_on()) {
630 {
631 MemCheck_off(); /* make sure we hold MALLOC2 lock */ 619 MemCheck_off(); /* make sure we hold MALLOC2 lock */
632 620
633 m.addr=addr1; 621 m.addr = addr1;
634 mp=lh_MEM_delete(mh,&m); 622 mp = lh_MEM_delete(mh, &m);
635 if (mp != NULL) 623 if (mp != NULL) {
636 {
637#ifdef LEVITTE_DEBUG_MEM 624#ifdef LEVITTE_DEBUG_MEM
638 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] * 0x%p (%d) -> 0x%p (%d)\n", 625 fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] * 0x%p (%d) -> 0x%p (%d)\n",
639 mp->order, 626 mp->order,
640 mp->addr, mp->num, 627 mp->addr, mp->num,
641 addr2, num); 628 addr2, num);
642#endif 629#endif
643 mp->addr=addr2; 630 mp->addr = addr2;
644 mp->num=num; 631 mp->num = num;
645 (void)lh_MEM_insert(mh,mp); 632 (void)lh_MEM_insert(mh, mp);
646 } 633 }
647 634
648 MemCheck_on(); /* release MALLOC2 lock 635 MemCheck_on(); /* release MALLOC2 lock
649 * if num_disabled drops to 0 */ 636 * if num_disabled drops to 0 */
650 }
651 break;
652 } 637 }
653 return; 638 break;
654 } 639 }
640 return;
641}
655 642
656 643
657typedef struct mem_leak_st 644typedef struct mem_leak_st {
658 {
659 BIO *bio; 645 BIO *bio;
660 int chunks; 646 int chunks;
661 long bytes; 647 long bytes;
662 } MEM_LEAK; 648} MEM_LEAK;
663 649
664static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l) 650static void
665 { 651print_leak_doall_arg(const MEM *m, MEM_LEAK *l)
652{
666 char buf[1024]; 653 char buf[1024];
667 char *bufp = buf; 654 char *bufp = buf;
668 APP_INFO *amip; 655 APP_INFO *amip;
@@ -672,89 +659,83 @@ static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l)
672 659
673#define BUF_REMAIN (sizeof buf - (size_t)(bufp - buf)) 660#define BUF_REMAIN (sizeof buf - (size_t)(bufp - buf))
674 661
675 if(m->addr == (char *)l->bio) 662 if (m->addr == (char *)l->bio)
676 return; 663 return;
677 664
678 if (options & V_CRYPTO_MDEBUG_TIME) 665 if (options & V_CRYPTO_MDEBUG_TIME) {
679 {
680 lcl = localtime(&m->time); 666 lcl = localtime(&m->time);
681 667
682 BIO_snprintf(bufp, BUF_REMAIN, "[%02d:%02d:%02d] ", 668 BIO_snprintf(bufp, BUF_REMAIN, "[%02d:%02d:%02d] ",
683 lcl->tm_hour,lcl->tm_min,lcl->tm_sec); 669 lcl->tm_hour, lcl->tm_min, lcl->tm_sec);
684 bufp += strlen(bufp); 670 bufp += strlen(bufp);
685 } 671 }
686 672
687 BIO_snprintf(bufp, BUF_REMAIN, "%5lu file=%s, line=%d, ", 673 BIO_snprintf(bufp, BUF_REMAIN, "%5lu file=%s, line=%d, ",
688 m->order,m->file,m->line); 674 m->order, m->file, m->line);
689 bufp += strlen(bufp); 675 bufp += strlen(bufp);
690 676
691 if (options & V_CRYPTO_MDEBUG_THREAD) 677 if (options & V_CRYPTO_MDEBUG_THREAD) {
692 {
693 BIO_snprintf(bufp, BUF_REMAIN, "thread=%lu, ", 678 BIO_snprintf(bufp, BUF_REMAIN, "thread=%lu, ",
694 CRYPTO_THREADID_hash(&m->threadid)); 679 CRYPTO_THREADID_hash(&m->threadid));
695 bufp += strlen(bufp); 680 bufp += strlen(bufp);
696 } 681 }
697 682
698 BIO_snprintf(bufp, BUF_REMAIN, "number=%d, address=%08lX\n", 683 BIO_snprintf(bufp, BUF_REMAIN, "number=%d, address=%08lX\n",
699 m->num,(unsigned long)m->addr); 684 m->num,(unsigned long)m->addr);
700 bufp += strlen(bufp); 685 bufp += strlen(bufp);
701 686
702 BIO_puts(l->bio,buf); 687 BIO_puts(l->bio, buf);
703 688
704 l->chunks++; 689 l->chunks++;
705 l->bytes+=m->num; 690 l->bytes += m->num;
706 691
707 amip=m->app_info; 692 amip = m->app_info;
708 ami_cnt=0; 693 ami_cnt = 0;
709 if (!amip) 694 if (!amip)
710 return; 695 return;
711 CRYPTO_THREADID_cpy(&ti, &amip->threadid); 696 CRYPTO_THREADID_cpy(&ti, &amip->threadid);
712 697
713 do 698 do {
714 {
715 int buf_len; 699 int buf_len;
716 int info_len; 700 int info_len;
717 701
718 ami_cnt++; 702 ami_cnt++;
719 memset(buf,'>',ami_cnt); 703 memset(buf, '>', ami_cnt);
720 BIO_snprintf(buf + ami_cnt, sizeof buf - ami_cnt, 704 BIO_snprintf(buf + ami_cnt, sizeof buf - ami_cnt,
721 " thread=%lu, file=%s, line=%d, info=\"", 705 " thread=%lu, file=%s, line=%d, info=\"",
722 CRYPTO_THREADID_hash(&amip->threadid), amip->file, 706 CRYPTO_THREADID_hash(&amip->threadid), amip->file,
723 amip->line); 707 amip->line);
724 buf_len=strlen(buf); 708 buf_len = strlen(buf);
725 info_len=strlen(amip->info); 709 info_len = strlen(amip->info);
726 if (128 - buf_len - 3 < info_len) 710 if (128 - buf_len - 3 < info_len) {
727 {
728 memcpy(buf + buf_len, amip->info, 128 - buf_len - 3); 711 memcpy(buf + buf_len, amip->info, 128 - buf_len - 3);
729 buf_len = 128 - 3; 712 buf_len = 128 - 3;
730 } 713 } else {
731 else
732 {
733 BUF_strlcpy(buf + buf_len, amip->info, 714 BUF_strlcpy(buf + buf_len, amip->info,
734 sizeof buf - buf_len); 715 sizeof buf - buf_len);
735 buf_len = strlen(buf); 716 buf_len = strlen(buf);
736 } 717 }
737 BIO_snprintf(buf + buf_len, sizeof buf - buf_len, "\"\n"); 718 BIO_snprintf(buf + buf_len, sizeof buf - buf_len, "\"\n");
738 719
739 BIO_puts(l->bio,buf); 720 BIO_puts(l->bio, buf);
740 721
741 amip = amip->next; 722 amip = amip->next;
742 } 723 } while (amip && !CRYPTO_THREADID_cmp(&amip->threadid, &ti));
743 while(amip && !CRYPTO_THREADID_cmp(&amip->threadid, &ti));
744 724
745#ifdef LEVITTE_DEBUG_MEM 725#ifdef LEVITTE_DEBUG_MEM
746 if (amip) 726 if (amip) {
747 {
748 fprintf(stderr, "Thread switch detected in backtrace!!!!\n"); 727 fprintf(stderr, "Thread switch detected in backtrace!!!!\n");
749 abort(); 728 abort();
750 }
751#endif
752 } 729 }
730#endif
731}
753 732
754static IMPLEMENT_LHASH_DOALL_ARG_FN(print_leak, const MEM, MEM_LEAK) 733static
734IMPLEMENT_LHASH_DOALL_ARG_FN(print_leak, const MEM, MEM_LEAK)
755 735
756void CRYPTO_mem_leaks(BIO *b) 736void
757 { 737CRYPTO_mem_leaks(BIO *b)
738{
758 MEM_LEAK ml; 739 MEM_LEAK ml;
759 740
760 if (mh == NULL && amih == NULL) 741 if (mh == NULL && amih == NULL)
@@ -762,22 +743,19 @@ void CRYPTO_mem_leaks(BIO *b)
762 743
763 MemCheck_off(); /* obtain MALLOC2 lock */ 744 MemCheck_off(); /* obtain MALLOC2 lock */
764 745
765 ml.bio=b; 746 ml.bio = b;
766 ml.bytes=0; 747 ml.bytes = 0;
767 ml.chunks=0; 748 ml.chunks = 0;
768 if (mh != NULL) 749 if (mh != NULL)
769 lh_MEM_doall_arg(mh, LHASH_DOALL_ARG_FN(print_leak), MEM_LEAK, 750 lh_MEM_doall_arg(mh, LHASH_DOALL_ARG_FN(print_leak),
770 &ml); 751 MEM_LEAK, &ml);
771 if (ml.chunks != 0) 752 if (ml.chunks != 0) {
772 { 753 BIO_printf(b, "%ld bytes leaked in %d chunks\n",
773 BIO_printf(b,"%ld bytes leaked in %d chunks\n", 754 ml.bytes, ml.chunks);
774 ml.bytes,ml.chunks);
775#ifdef CRYPTO_MDEBUG_ABORT 755#ifdef CRYPTO_MDEBUG_ABORT
776 abort(); 756 abort();
777#endif 757#endif
778 } 758 } else {
779 else
780 {
781 /* Make sure that, if we found no leaks, memory-leak debugging itself 759 /* Make sure that, if we found no leaks, memory-leak debugging itself
782 * does not introduce memory leaks (which might irritate 760 * does not introduce memory leaks (which might irritate
783 * external debugging tools). 761 * external debugging tools).
@@ -802,43 +780,43 @@ void CRYPTO_mem_leaks(BIO *b)
802 old_mh_mode = mh_mode; 780 old_mh_mode = mh_mode;
803 mh_mode = CRYPTO_MEM_CHECK_OFF; 781 mh_mode = CRYPTO_MEM_CHECK_OFF;
804 782
805 if (mh != NULL) 783 if (mh != NULL) {
806 {
807 lh_MEM_free(mh); 784 lh_MEM_free(mh);
808 mh = NULL; 785 mh = NULL;
809 } 786 }
810 if (amih != NULL) 787 if (amih != NULL) {
811 { 788 if (lh_APP_INFO_num_items(amih) == 0) {
812 if (lh_APP_INFO_num_items(amih) == 0)
813 {
814 lh_APP_INFO_free(amih); 789 lh_APP_INFO_free(amih);
815 amih = NULL; 790 amih = NULL;
816 }
817 } 791 }
792 }
818 793
819 mh_mode = old_mh_mode; 794 mh_mode = old_mh_mode;
820 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC); 795 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
821 }
822 MemCheck_on(); /* release MALLOC2 lock */
823 } 796 }
797 MemCheck_on(); /* release MALLOC2 lock */
798}
824 799
825#ifndef OPENSSL_NO_FP_API 800#ifndef OPENSSL_NO_FP_API
826void CRYPTO_mem_leaks_fp(FILE *fp) 801void
827 { 802CRYPTO_mem_leaks_fp(FILE *fp)
803{
828 BIO *b; 804 BIO *b;
829 805
830 if (mh == NULL) return; 806 if (mh == NULL)
807 return;
831 /* Need to turn off memory checking when allocated BIOs ... especially 808 /* Need to turn off memory checking when allocated BIOs ... especially
832 * as we're creating them at a time when we're trying to check we've not 809 * as we're creating them at a time when we're trying to check we've not
833 * left anything un-free()'d!! */ 810 * left anything un-free()'d!! */
834 MemCheck_off(); 811 MemCheck_off();
835 b = BIO_new(BIO_s_file()); 812 b = BIO_new(BIO_s_file());
836 MemCheck_on(); 813 MemCheck_on();
837 if(!b) return; 814 if (!b)
838 BIO_set_fp(b,fp,BIO_NOCLOSE); 815 return;
816 BIO_set_fp(b, fp, BIO_NOCLOSE);
839 CRYPTO_mem_leaks(b); 817 CRYPTO_mem_leaks(b);
840 BIO_free(b); 818 BIO_free(b);
841 } 819}
842#endif 820#endif
843 821
844 822
@@ -857,18 +835,21 @@ void CRYPTO_mem_leaks_fp(FILE *fp)
857 835
858typedef CRYPTO_MEM_LEAK_CB *PCRYPTO_MEM_LEAK_CB; 836typedef CRYPTO_MEM_LEAK_CB *PCRYPTO_MEM_LEAK_CB;
859 837
860static void cb_leak_doall_arg(const MEM *m, PCRYPTO_MEM_LEAK_CB *cb) 838static void
861 { 839cb_leak_doall_arg(const MEM *m, PCRYPTO_MEM_LEAK_CB *cb)
862 (*cb)(m->order,m->file,m->line,m->num,m->addr); 840{
863 } 841 (*cb)(m->order, m->file, m->line, m->num, m->addr);
842}
864 843
865static IMPLEMENT_LHASH_DOALL_ARG_FN(cb_leak, const MEM, PCRYPTO_MEM_LEAK_CB) 844static IMPLEMENT_LHASH_DOALL_ARG_FN(cb_leak, const MEM, PCRYPTO_MEM_LEAK_CB)
866 845
867void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb) 846void
868 { 847CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb)
869 if (mh == NULL) return; 848{
849 if (mh == NULL)
850 return;
870 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2); 851 CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2);
871 lh_MEM_doall_arg(mh, LHASH_DOALL_ARG_FN(cb_leak), PCRYPTO_MEM_LEAK_CB, 852 lh_MEM_doall_arg(mh, LHASH_DOALL_ARG_FN(cb_leak), PCRYPTO_MEM_LEAK_CB,
872 &cb); 853 &cb);
873 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2); 854 CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2);
874 } 855}