From 6c66259cf66afb18567a4b3518970b6a53fda61a Mon Sep 17 00:00:00 2001 From: Alliballibaba Date: Sun, 26 Jan 2025 00:59:11 +0100 Subject: [PATCH 1/4] Only flush temporary streams. --- frankenphp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frankenphp.c b/frankenphp.c index ecd38cdb3..4b9f905a1 100644 --- a/frankenphp.c +++ b/frankenphp.c @@ -137,7 +137,7 @@ static void frankenphp_worker_request_shutdown() { zend_set_memory_limit(PG(memory_limit)); /* - * free any php_stream resources that are not php source files + * free php_stream resources that are temporary (php_stream_temp_ops) * all resources are stored in EG(regular_list), see zend_list.c */ zend_resource *val; @@ -145,7 +145,7 @@ static void frankenphp_worker_request_shutdown() { /* verify the resource is a stream */ if (val->type == php_file_le_stream()) { php_stream *stream = (php_stream *)val->ptr; - if (stream != NULL && stream->ops != &php_stream_stdio_ops && + if (stream != NULL && stream->ops == &php_stream_temp_ops && !stream->is_persistent && GC_REFCOUNT(val) == 1) { zend_list_delete(val); } From c59f520102a311875ede02956d28f473778951e2 Mon Sep 17 00:00:00 2001 From: Alliballibaba Date: Sun, 26 Jan 2025 12:15:37 +0100 Subject: [PATCH 2/4] Refines stream releasing. --- frankenphp.c | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/frankenphp.c b/frankenphp.c index 4b9f905a1..e7d1727f1 100644 --- a/frankenphp.c +++ b/frankenphp.c @@ -108,6 +108,28 @@ static void frankenphp_destroy_super_globals() { zend_end_try(); } +/* + * free php_stream resources that are temporary (php_stream_temp_ops) + * streams are globally registered in EG(regular_list), see zend_list.c + * this fixes a leak when reading the body of a request + */ +static void frankenphp_release_temporary_streams(){ + zend_resource *val; + int stream_type = php_file_le_stream(); + ZEND_HASH_FOREACH_PTR(&EG(regular_list), val) { + /* verify the resource is a stream */ + if (val->type == stream_type) { + php_stream *stream = (php_stream *)val->ptr; + if (stream != NULL && stream->ops == &php_stream_temp_ops && + !stream->is_persistent && stream->__exposed == 0 && GC_REFCOUNT(val) == 1) { + zend_list_close(val); + zend_list_delete(val); + } + } + } + ZEND_HASH_FOREACH_END(); +} + /* Adapted from php_request_shutdown */ static void frankenphp_worker_request_shutdown() { /* Flush all output buffers */ @@ -135,23 +157,6 @@ static void frankenphp_worker_request_shutdown() { zend_end_try(); zend_set_memory_limit(PG(memory_limit)); - - /* - * free php_stream resources that are temporary (php_stream_temp_ops) - * all resources are stored in EG(regular_list), see zend_list.c - */ - zend_resource *val; - ZEND_HASH_FOREACH_PTR(&EG(regular_list), val) { - /* verify the resource is a stream */ - if (val->type == php_file_le_stream()) { - php_stream *stream = (php_stream *)val->ptr; - if (stream != NULL && stream->ops == &php_stream_temp_ops && - !stream->is_persistent && GC_REFCOUNT(val) == 1) { - zend_list_delete(val); - } - } - } - ZEND_HASH_FOREACH_END(); } PHPAPI void get_full_env(zval *track_vars_array) { @@ -179,6 +184,7 @@ static int frankenphp_worker_request_startup() { zend_try { frankenphp_destroy_super_globals(); + frankenphp_release_temporary_streams(); php_output_activate(); /* initialize global variables */ From f7c130a94f26790acf39cbb01bc9051f44acfbb9 Mon Sep 17 00:00:00 2001 From: Alliballibaba Date: Sun, 26 Jan 2025 12:16:20 +0100 Subject: [PATCH 3/4] clang-format --- frankenphp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frankenphp.c b/frankenphp.c index e7d1727f1..db6aa468f 100644 --- a/frankenphp.c +++ b/frankenphp.c @@ -113,7 +113,7 @@ static void frankenphp_destroy_super_globals() { * streams are globally registered in EG(regular_list), see zend_list.c * this fixes a leak when reading the body of a request */ -static void frankenphp_release_temporary_streams(){ +static void frankenphp_release_temporary_streams() { zend_resource *val; int stream_type = php_file_le_stream(); ZEND_HASH_FOREACH_PTR(&EG(regular_list), val) { @@ -121,7 +121,8 @@ static void frankenphp_release_temporary_streams(){ if (val->type == stream_type) { php_stream *stream = (php_stream *)val->ptr; if (stream != NULL && stream->ops == &php_stream_temp_ops && - !stream->is_persistent && stream->__exposed == 0 && GC_REFCOUNT(val) == 1) { + !stream->is_persistent && stream->__exposed == 0 && + GC_REFCOUNT(val) == 1) { zend_list_close(val); zend_list_delete(val); } From 6f18a71e9620b8a9280ca6561c18cc3c199ce2fc Mon Sep 17 00:00:00 2001 From: Alliballibaba Date: Sun, 26 Jan 2025 12:20:21 +0100 Subject: [PATCH 4/4] trigger pipeline