]> granicus.if.org Git - php/commitdiff
Fix fpm limit_extensions leak
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 25 Jun 2019 13:01:58 +0000 (15:01 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 26 Jun 2019 09:40:39 +0000 (11:40 +0200)
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
sapi/fpm/fpm/fpm_worker_pool.c
sapi/fpm/fpm/fpm_worker_pool.h

index ab3c5af18e95ec3ab10abd925e64c0a83c859a3d..d940ba661c0735bbee03f2997ca6c39dfe63c617 100644 (file)
@@ -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;
 }
index e4ad73169d49118732e8682685980ec4ac9cd48d..d04528f4e0d0e06887ab1a5ef6183adf2f7b389b 100644 (file)
 
 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);
 }
index 37f4e5199499d310ff4acbe4a2554260db9cdb33..8f4f440a848471a0218ede1cf996cc00d3cc4a4b 100644 (file)
@@ -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