summaryrefslogtreecommitdiffstats
path: root/crypto/async
diff options
context:
space:
mode:
authorSteven Linsell <stevenx.linsell@intel.com>2016-03-20 23:00:13 +0000
committerMatt Caswell <matt@openssl.org>2016-03-21 16:57:34 +0000
commit55327ddfc13d9b9e48fb2d5287e9698a9589790c (patch)
tree85a7f89ddfeebfeafac9910d7f00ae013310ae5c /crypto/async
parent7188f1f650e1130dbf0574c8276c0eb8cdbf0617 (diff)
Fix memory leak where fdlookup linked list is not freed during
ASYNC_WAIT_CTX_free Reviewed-by: Rich Salz <rsalz@openssl.org> Reviewed-by: Matt Caswell <matt@openssl.org>
Diffstat (limited to 'crypto/async')
-rw-r--r--crypto/async/async_wait.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/crypto/async/async_wait.c b/crypto/async/async_wait.c
index 94f1a6b4e0..ece995f4e9 100644
--- a/crypto/async/async_wait.c
+++ b/crypto/async/async_wait.c
@@ -63,20 +63,22 @@ ASYNC_WAIT_CTX *ASYNC_WAIT_CTX_new(void)
void ASYNC_WAIT_CTX_free(ASYNC_WAIT_CTX *ctx)
{
struct fd_lookup_st *curr;
+ struct fd_lookup_st *next;
if (ctx == NULL)
return;
curr = ctx->fds;
while (curr != NULL) {
- if (curr->del) {
- /* This one has already been deleted so do nothing */
- curr = curr->next;
- continue;
+ if (!curr->del) {
+ /* Only try and cleanup if it hasn't been marked deleted */
+ if (curr->cleanup != NULL)
+ curr->cleanup(ctx, curr->key, curr->fd, curr->custom_data);
}
- if (curr->cleanup != NULL)
- curr->cleanup(ctx, curr->key, curr->fd, curr->custom_data);
- curr = curr->next;
+ /* Always free the fd_lookup_st */
+ next = curr->next;
+ OPENSSL_free(curr);
+ curr = next;
}
OPENSSL_free(ctx);