summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/mem_dbg.c
diff options
context:
space:
mode:
authorjsing <>2014-04-15 13:42:55 +0000
committerjsing <>2014-04-15 13:42:55 +0000
commit69a8d2dcc19aed0d1116ba2ecd81cce5ae736c94 (patch)
treef085d85cb06e6b6e1a1b1d52cced54d9f7d7e5f2 /src/lib/libcrypto/mem_dbg.c
parentc7fdfc89ee30180bf262c4b146c1b6e1030083d6 (diff)
downloadopenbsd-69a8d2dcc19aed0d1116ba2ecd81cce5ae736c94.tar.gz
openbsd-69a8d2dcc19aed0d1116ba2ecd81cce5ae736c94.tar.bz2
openbsd-69a8d2dcc19aed0d1116ba2ecd81cce5ae736c94.zip
First pass at applying KNF to the OpenSSL code, which almost makes it
readable. This pass is whitespace only and can readily be verified using tr and md5.
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}