diff options
author | jsing <> | 2014-04-15 13:42:55 +0000 |
---|---|---|
committer | jsing <> | 2014-04-15 13:42:55 +0000 |
commit | 69a8d2dcc19aed0d1116ba2ecd81cce5ae736c94 (patch) | |
tree | f085d85cb06e6b6e1a1b1d52cced54d9f7d7e5f2 /src/lib/libcrypto/mem_dbg.c | |
parent | c7fdfc89ee30180bf262c4b146c1b6e1030083d6 (diff) | |
download | openbsd-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.c | 643 |
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 | ||
121 | static int mh_mode=CRYPTO_MEM_CHECK_OFF; | 121 | static 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; | |||
136 | static unsigned long order = 0; /* number of memory requests */ | 136 | static unsigned long order = 0; /* number of memory requests */ |
137 | 137 | ||
138 | DECLARE_LHASH_OF(MEM); | 138 | DECLARE_LHASH_OF(MEM); |
139 | static LHASH_OF(MEM) *mh=NULL; /* hash-table of memory requests | 139 | static 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 | ||
144 | typedef struct app_mem_info_st | 143 | typedef 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 | ||
161 | static void app_info_free(APP_INFO *); | 160 | static void app_info_free(APP_INFO *); |
162 | 161 | ||
163 | DECLARE_LHASH_OF(APP_INFO); | 162 | DECLARE_LHASH_OF(APP_INFO); |
164 | static LHASH_OF(APP_INFO) *amih=NULL; /* hash-table with those | 163 | static 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 | ||
171 | typedef struct mem_st | 170 | typedef 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 | ||
184 | static long options = /* extra information to be recorded */ | 183 | static 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 | | 185 | V_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 | | 188 | V_CRYPTO_MDEBUG_THREAD | |
190 | #endif | 189 | #endif |
191 | 0; | 190 | 0; |
192 | 191 | ||
193 | 192 | ||
194 | static unsigned int num_disable = 0; /* num_disable > 0 | 193 | static 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 | */ |
202 | static CRYPTO_THREADID disabling_threadid; | 201 | static CRYPTO_THREADID disabling_threadid; |
203 | 202 | ||
204 | static void app_info_free(APP_INFO *inf) | 203 | static void |
205 | { | 204 | app_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 | ||
216 | int CRYPTO_mem_ctrl(int mode) | 214 | int |
217 | { | 215 | CRYPTO_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 | ||
286 | int CRYPTO_is_mem_check_on(void) | 281 | int |
287 | { | 282 | CRYPTO_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 | ||
305 | void CRYPTO_dbg_set_options(long bits) | 300 | void |
306 | { | 301 | CRYPTO_dbg_set_options(long bits) |
302 | { | ||
307 | options = bits; | 303 | options = bits; |
308 | } | 304 | } |
309 | 305 | ||
310 | long CRYPTO_dbg_get_options(void) | 306 | long |
311 | { | 307 | CRYPTO_dbg_get_options(void) |
308 | { | ||
312 | return options; | 309 | return options; |
313 | } | 310 | } |
314 | 311 | ||
315 | static int mem_cmp(const MEM *a, const MEM *b) | 312 | static int |
316 | { | 313 | mem_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 | |||
327 | static IMPLEMENT_LHASH_COMP_FN(mem, MEM) | 327 | static IMPLEMENT_LHASH_COMP_FN(mem, MEM) |
328 | 328 | ||
329 | static unsigned long mem_hash(const MEM *a) | 329 | static unsigned long |
330 | { | 330 | mem_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 | } |
338 | static IMPLEMENT_LHASH_HASH_FN(mem, MEM) | 339 | |
340 | static | ||
341 | IMPLEMENT_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) */ |
341 | static int app_info_cmp(const void *a_void, const void *b_void) | 344 | static int |
342 | { | 345 | app_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 | |||
346 | static IMPLEMENT_LHASH_COMP_FN(app_info, APP_INFO) | 351 | static IMPLEMENT_LHASH_COMP_FN(app_info, APP_INFO) |
347 | 352 | ||
348 | static unsigned long app_info_hash(const APP_INFO *a) | 353 | static unsigned long |
349 | { | 354 | app_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 | |||
357 | static IMPLEMENT_LHASH_HASH_FN(app_info, APP_INFO) | 364 | static IMPLEMENT_LHASH_HASH_FN(app_info, APP_INFO) |
358 | 365 | ||
359 | static APP_INFO *pop_info(void) | 366 | static 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 | ||
397 | int CRYPTO_push_info_(const char *info, const char *file, int line) | 400 | int |
398 | { | 401 | CRYPTO_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 | ||
448 | int CRYPTO_pop_info(void) | 443 | return (ret); |
449 | { | 444 | } |
450 | int ret=0; | 445 | |
446 | int | ||
447 | CRYPTO_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 | ||
463 | int CRYPTO_remove_all_info(void) | 462 | int |
464 | { | 463 | CRYPTO_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 | ||
480 | static unsigned long break_order_num=0; | 480 | static unsigned long break_order_num = 0; |
481 | void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line, | 481 | void |
482 | int before_p) | 482 | CRYPTO_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 | } | ||
552 | err: | ||
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 | ||
569 | void CRYPTO_dbg_free(void *addr, int before_p) | 561 | void |
570 | { | 562 | CRYPTO_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 | ||
605 | void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num, | 595 | void |
606 | const char *file, int line, int before_p) | 596 | CRYPTO_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 | ||
657 | typedef struct mem_leak_st | 644 | typedef 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 | ||
664 | static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l) | 650 | static void |
665 | { | 651 | print_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 | ||
754 | static IMPLEMENT_LHASH_DOALL_ARG_FN(print_leak, const MEM, MEM_LEAK) | 733 | static |
734 | IMPLEMENT_LHASH_DOALL_ARG_FN(print_leak, const MEM, MEM_LEAK) | ||
755 | 735 | ||
756 | void CRYPTO_mem_leaks(BIO *b) | 736 | void |
757 | { | 737 | CRYPTO_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 |
826 | void CRYPTO_mem_leaks_fp(FILE *fp) | 801 | void |
827 | { | 802 | CRYPTO_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 | ||
858 | typedef CRYPTO_MEM_LEAK_CB *PCRYPTO_MEM_LEAK_CB; | 836 | typedef CRYPTO_MEM_LEAK_CB *PCRYPTO_MEM_LEAK_CB; |
859 | 837 | ||
860 | static void cb_leak_doall_arg(const MEM *m, PCRYPTO_MEM_LEAK_CB *cb) | 838 | static void |
861 | { | 839 | cb_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 | ||
865 | static IMPLEMENT_LHASH_DOALL_ARG_FN(cb_leak, const MEM, PCRYPTO_MEM_LEAK_CB) | 844 | static IMPLEMENT_LHASH_DOALL_ARG_FN(cb_leak, const MEM, PCRYPTO_MEM_LEAK_CB) |
866 | 845 | ||
867 | void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb) | 846 | void |
868 | { | 847 | CRYPTO_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 | } |