X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fmem_dbg.c;h=f3ad5ff235feccf249b400b5887f713191fdc371;hb=ec1258dd446e39649f846ee870721ca4dfe56cff;hp=c16fa7a2b8c55c995f071ac90c01ea060f208d02;hpb=0cd08cce17f665fe57b650d0d2f983f41c84b273;p=oweals%2Fopenssl.git diff --git a/crypto/mem_dbg.c b/crypto/mem_dbg.c index c16fa7a2b8..f3ad5ff235 100644 --- a/crypto/mem_dbg.c +++ b/crypto/mem_dbg.c @@ -88,9 +88,9 @@ typedef struct app_mem_info_st /* For application-defined information (static C-string `info') * to be displayed in memory leak list. * Each thread has its own stack. For applications, there is - * CRYPTO_add_info("...") to push an entry, - * CRYPTO_remove_info() to pop an entry, - * CRYPTO_remove_all_info() to pop all entries. + * CRYPTO_push_info("...") to push an entry, + * CRYPTO_pop_info() to pop an entry, + * CRYPTO_remove_all_info() to pop all entries. */ { unsigned long thread; @@ -249,7 +249,7 @@ static unsigned long app_info_hash(APP_INFO *a) return(ret); } -static APP_INFO *remove_info() +static APP_INFO *pop_info() { APP_INFO tmp; APP_INFO *ret = NULL; @@ -269,7 +269,7 @@ static APP_INFO *remove_info() #ifdef LEVITTE_DEBUG if (ret->thread != tmp.thread) { - fprintf(stderr, "remove_info(): deleted info has other thread ID (%lu) than the current thread (%lu)!!!!\n", + fprintf(stderr, "pop_info(): deleted info has other thread ID (%lu) than the current thread (%lu)!!!!\n", ret->thread, tmp.thread); abort(); } @@ -286,14 +286,14 @@ static APP_INFO *remove_info() return(ret); } -int CRYPTO_add_info_(const char *file, int line, const char *info) +int CRYPTO_push_info_(const char *info, const char *file, int line) { APP_INFO *ami, *amim; int ret=0; if (is_MemCheck_on()) { - MemCheck_off(); + MemCheck_off(); /* obtains CRYPTO_LOCK_MALLOC2 */ if ((ami = (APP_INFO *)Malloc(sizeof(APP_INFO))) == NULL) { @@ -322,7 +322,7 @@ int CRYPTO_add_info_(const char *file, int line, const char *info) #ifdef LEVITTE_DEBUG if (ami->thread != amim->thread) { - fprintf(stderr, "CRYPTO_add_info(): previous info has other thread ID (%lu) than the current thread (%lu)!!!!\n", + fprintf(stderr, "CRYPTO_push_info(): previous info has other thread ID (%lu) than the current thread (%lu)!!!!\n", amim->thread, ami->thread); abort(); } @@ -330,25 +330,23 @@ int CRYPTO_add_info_(const char *file, int line, const char *info) ami->next=amim; } err: - MemCheck_on(); + MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */ } return(ret); } -int CRYPTO_remove_info(void) +int CRYPTO_pop_info(void) { int ret=0; - if (is_MemCheck_on()) /* _must_ be true, or something went severly wrong */ + if (is_MemCheck_on()) /* _must_ be true, or something went severely wrong */ { - MemCheck_off(); - CRYPTO_w_lock(CRYPTO_LOCK_MALLOC); + MemCheck_off(); /* obtains CRYPTO_LOCK_MALLOC2 */ - ret=(remove_info() != NULL); + ret=(pop_info() != NULL); - CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC); - MemCheck_on(); + MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */ } return(ret); } @@ -359,14 +357,12 @@ int CRYPTO_remove_all_info(void) if (is_MemCheck_on()) /* _must_ be true */ { - MemCheck_off(); - CRYPTO_w_lock(CRYPTO_LOCK_MALLOC); + MemCheck_off(); /* obtains CRYPTO_LOCK_MALLOC2 */ - while(remove_info() != NULL) + while(pop_info() != NULL) ret++; - CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC); - MemCheck_on(); + MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */ } return(ret); } @@ -389,14 +385,13 @@ void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line, if (is_MemCheck_on()) { - MemCheck_off(); + MemCheck_off(); /* obtains CRYPTO_LOCK_MALLOC2 */ if ((m=(MEM *)Malloc(sizeof(MEM))) == NULL) { Free(addr); - MemCheck_on(); + MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */ return; } - CRYPTO_w_lock(CRYPTO_LOCK_MALLOC); if (mh == NULL) { if ((mh=lh_new(mem_hash,mem_cmp)) == NULL) @@ -453,8 +448,7 @@ void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line, Free(mm); } err: - CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC); - MemCheck_on(); + MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */ } break; } @@ -490,7 +484,7 @@ void CRYPTO_dbg_free(void *addr, int before_p) Free(mp); } - MemCheck_on(); + MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */ } break; case 1: @@ -524,8 +518,7 @@ void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num, if (is_MemCheck_on()) { - MemCheck_off(); - CRYPTO_w_lock(CRYPTO_LOCK_MALLOC); + MemCheck_off(); /* obtains CRYPTO_LOCK_MALLOC2 */ m.addr=addr1; mp=(MEM *)lh_delete(mh,(char *)&m); @@ -542,8 +535,7 @@ void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num, lh_insert(mh,(char *)mp); } - CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC); - MemCheck_on(); + MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */ } break; } @@ -600,9 +592,11 @@ static void print_leak(MEM *m, MEM_LEAK *l) amip=m->app_info; ami_cnt=0; - if (amip) - ti=amip->thread; - while(amip && amip->thread == ti) + if (!amip) + return; + ti=amip->thread; + + do { int buf_len; int info_len; @@ -610,7 +604,7 @@ static void print_leak(MEM *m, MEM_LEAK *l) ami_cnt++; memset(buf,'>',ami_cnt); sprintf(buf + ami_cnt, - "thread=%lu, file=%s, line=%d, info=\"", + " thread=%lu, file=%s, line=%d, info=\"", amip->thread, amip->file, amip->line); buf_len=strlen(buf); info_len=strlen(amip->info); @@ -630,10 +624,12 @@ static void print_leak(MEM *m, MEM_LEAK *l) amip = amip->next; } + while(amip && amip->thread == ti); + #ifdef LEVITTE_DEBUG if (amip) { - fprintf(stderr, "Thread switch detected i backtrace!!!!\n"); + fprintf(stderr, "Thread switch detected in backtrace!!!!\n"); abort(); } #endif @@ -665,21 +661,29 @@ void CRYPTO_mem_leaks(BIO *b) #endif } -static void (*mem_cb)()=NULL; +union void_fn_to_char_u + { + char *char_p; + void (*fn_p)(); + }; static void cb_leak(MEM *m, char *cb) { - void (*mem_callback)()=(void (*)())cb; - mem_callback(m->order,m->file,m->line,m->num,m->addr); + union void_fn_to_char_u mem_callback; + + mem_callback.char_p=cb; + mem_callback.fn_p(m->order,m->file,m->line,m->num,m->addr); } void CRYPTO_mem_leaks_cb(void (*cb)()) { + union void_fn_to_char_u mem_cb; + if (mh == NULL) return; CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2); - mem_cb=cb; - lh_doall_arg(mh,(void (*)())cb_leak,(char *)mem_cb); - mem_cb=NULL; + mem_cb.fn_p=cb; + lh_doall_arg(mh,(void (*)())cb_leak,mem_cb.char_p); + mem_cb.char_p=NULL; CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2); }