From: Pauli Date: Wed, 26 Jul 2017 00:04:05 +0000 (+1000) Subject: Fix potential use-after-free and memory leak X-Git-Tag: OpenSSL_1_1_0g~125 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=74ef4b8fb9c78f517c97c51a91af4bacba785ed6;p=oweals%2Fopenssl.git Fix potential use-after-free and memory leak In function wait_for_async(), allocated async fds is freed if `SSL_get_all_async_fds` fails, but later `fds` is used. Interestingly, it is not freed when everything succeeds. Rewrite the FD set loop to make it more readable and to not modify the allocated pointer so it can be freed. Reviewed-by: Andy Polyakov Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/3992) (cherry picked from commit 0a3452520fe4cd6871ae8b7c4199c6d5d4efe912) --- diff --git a/apps/apps.c b/apps/apps.c index cbf4e90b54..d3cb19dab6 100644 --- a/apps/apps.c +++ b/apps/apps.c @@ -2575,6 +2575,7 @@ void wait_for_async(SSL *s) fd_set asyncfds; OSSL_ASYNC_FD *fds; size_t numfds; + size_t i; if (!SSL_get_all_async_fds(s, NULL, &numfds)) return; @@ -2583,17 +2584,17 @@ void wait_for_async(SSL *s) fds = app_malloc(sizeof(OSSL_ASYNC_FD) * numfds, "allocate async fds"); if (!SSL_get_all_async_fds(s, fds, &numfds)) { OPENSSL_free(fds); + return; } FD_ZERO(&asyncfds); - while (numfds > 0) { - if (width <= (int)*fds) - width = (int)*fds + 1; - openssl_fdset((int)*fds, &asyncfds); - numfds--; - fds++; + for (i = 0; i < numfds; i++) { + if (width <= (int)fds[i]) + width = (int)fds[i] + 1; + openssl_fdset((int)fds[i], &asyncfds); } select(width, (void *)&asyncfds, NULL, NULL, NULL); + OPENSSL_free(fds); #endif }