From 698dd32b03dc4e9998364247bab1d0ace55910e4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 25 Jun 2019 15:01:58 +0200 Subject: [PATCH] Fix fpm limit_extensions leak The logic here is somewhat ugly because the worker pool structure gets freed early, so we need to explicitly transfer ownership. --- sapi/fpm/fpm/fpm_php.c | 5 +++++ sapi/fpm/fpm/fpm_worker_pool.c | 12 ++++++++++++ sapi/fpm/fpm/fpm_worker_pool.h | 2 ++ 3 files changed, 19 insertions(+) diff --git a/sapi/fpm/fpm/fpm_php.c b/sapi/fpm/fpm/fpm_php.c index ab3c5af18e..d940ba661c 100644 --- a/sapi/fpm/fpm/fpm_php.c +++ b/sapi/fpm/fpm/fpm_php.c @@ -197,6 +197,9 @@ static void fpm_php_cleanup(int which, void *arg) /* {{{ */ { php_module_shutdown(); sapi_shutdown(); + if (limit_extensions) { + fpm_worker_pool_free_limit_extensions(limit_extensions); + } } /* }}} */ @@ -223,7 +226,9 @@ int fpm_php_init_child(struct fpm_worker_pool_s *wp) /* {{{ */ } if (wp->limit_extensions) { + /* Take ownership of limit_extensions. */ limit_extensions = wp->limit_extensions; + wp->limit_extensions = NULL; } return 0; } diff --git a/sapi/fpm/fpm/fpm_worker_pool.c b/sapi/fpm/fpm/fpm_worker_pool.c index e4ad73169d..d04528f4e0 100644 --- a/sapi/fpm/fpm/fpm_worker_pool.c +++ b/sapi/fpm/fpm/fpm_worker_pool.c @@ -17,6 +17,15 @@ struct fpm_worker_pool_s *fpm_worker_all_pools; +void fpm_worker_pool_free_limit_extensions(char **limit_extensions) { + char **ext = limit_extensions; + while (*ext) { + free(*ext); + ext++; + } + free(limit_extensions); +} + void fpm_worker_pool_free(struct fpm_worker_pool_s *wp) /* {{{ */ { if (wp->config) { @@ -28,6 +37,9 @@ void fpm_worker_pool_free(struct fpm_worker_pool_s *wp) /* {{{ */ if (wp->home) { free(wp->home); } + if (wp->limit_extensions) { + fpm_worker_pool_free_limit_extensions(wp->limit_extensions); + } fpm_unix_free_socket_premissions(wp); free(wp); } diff --git a/sapi/fpm/fpm/fpm_worker_pool.h b/sapi/fpm/fpm/fpm_worker_pool.h index 37f4e51994..8f4f440a84 100644 --- a/sapi/fpm/fpm/fpm_worker_pool.h +++ b/sapi/fpm/fpm/fpm_worker_pool.h @@ -50,6 +50,8 @@ struct fpm_worker_pool_s *fpm_worker_pool_alloc(); void fpm_worker_pool_free(struct fpm_worker_pool_s *wp); int fpm_worker_pool_init_main(); +void fpm_worker_pool_free_limit_extensions(char **limit_extensions); + extern struct fpm_worker_pool_s *fpm_worker_all_pools; #endif -- 2.40.0