diff options
author | Pascal Cuoq <cuoq@trust-in-soft.com> | 2016-01-10 13:43:37 +0100 |
---|---|---|
committer | Kurt Roeckx <kurt@roeckx.be> | 2016-01-11 20:30:37 +0100 |
commit | 96e25c499b39e4d4893e94ef1e0f726c85197c09 (patch) | |
tree | 0e1a9b36b9949a97e830d6e7b55d181a7a9c5fb9 /crypto/mem_dbg.c | |
parent | update ordinals (diff) | |
download | openssl-96e25c499b39e4d4893e94ef1e0f726c85197c09.tar.xz openssl-96e25c499b39e4d4893e94ef1e0f726c85197c09.zip |
Function pop_info() returned a dangling pointer
Signed-off-by: Kurt Roeckx <kurt@roeckx.be>
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto/mem_dbg.c')
-rw-r--r-- | crypto/mem_dbg.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/crypto/mem_dbg.c b/crypto/mem_dbg.c index 8580447c0a..67a48001ec 100644 --- a/crypto/mem_dbg.c +++ b/crypto/mem_dbg.c @@ -331,29 +331,31 @@ static unsigned long app_info_hash(const APP_INFO *a) return (ret); } -static APP_INFO *pop_info(void) +/* returns 1 if there was an info to pop, 0 if the stack was empty. */ +static int pop_info(void) { APP_INFO tmp; - APP_INFO *ret = NULL; + APP_INFO *current = NULL; if (amih != NULL) { CRYPTO_THREADID_current(&tmp.threadid); - if ((ret = lh_APP_INFO_delete(amih, &tmp)) != NULL) { - APP_INFO *next = ret->next; + if ((current = lh_APP_INFO_delete(amih, &tmp)) != NULL) { + APP_INFO *next = current->next; if (next != NULL) { next->references++; (void)lh_APP_INFO_insert(amih, next); } - if (--(ret->references) <= 0) { - ret->next = NULL; + if (--(current->references) <= 0) { + current->next = NULL; if (next != NULL) next->references--; - OPENSSL_free(ret); + OPENSSL_free(current); } + return 1; } } - return (ret); + return 0; } int CRYPTO_mem_debug_push(const char *info, const char *file, int line) @@ -396,7 +398,7 @@ int CRYPTO_mem_debug_pop(void) if (mem_check_on()) { CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE); - ret = (pop_info() != NULL); + ret = pop_info(); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE); } return (ret); |