From 3902f843f7ae33cf45a0a9acc4e30f4b92c7a6dd Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Sat, 7 Mar 2026 12:41:52 +0100 Subject: [PATCH 1/6] [skip ci] Mark sapi/fpm/tests/proc-idle-timeout.phpt as XFAIL This test fails all the time. It should be improved. --- sapi/fpm/tests/proc-idle-timeout.phpt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapi/fpm/tests/proc-idle-timeout.phpt b/sapi/fpm/tests/proc-idle-timeout.phpt index 313b543b4cb7..456faf26fd7f 100644 --- a/sapi/fpm/tests/proc-idle-timeout.phpt +++ b/sapi/fpm/tests/proc-idle-timeout.phpt @@ -1,5 +1,7 @@ --TEST-- FPM: Process manager config pm.process_idle_timeout +--XFAIL-- +Frequently fails in CI --SKIPIF-- Date: Sat, 7 Mar 2026 13:05:32 +0100 Subject: [PATCH 2/6] Add back FPM_RUN_RESOURCE_HEAVY_TESTS --- sapi/fpm/tests/proc-idle-timeout.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/fpm/tests/proc-idle-timeout.phpt b/sapi/fpm/tests/proc-idle-timeout.phpt index 456faf26fd7f..6be251f1d203 100644 --- a/sapi/fpm/tests/proc-idle-timeout.phpt +++ b/sapi/fpm/tests/proc-idle-timeout.phpt @@ -5,7 +5,7 @@ Frequently fails in CI --SKIPIF-- --FILE-- From 04023e5e724ab16dbfd6513739611b01cd1a1d48 Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sat, 7 Mar 2026 13:11:37 +0100 Subject: [PATCH 3/6] Remove XFAIL for proc-idle-timeout.phpt --- sapi/fpm/tests/proc-idle-timeout.phpt | 2 -- 1 file changed, 2 deletions(-) diff --git a/sapi/fpm/tests/proc-idle-timeout.phpt b/sapi/fpm/tests/proc-idle-timeout.phpt index 6be251f1d203..3febbcff3091 100644 --- a/sapi/fpm/tests/proc-idle-timeout.phpt +++ b/sapi/fpm/tests/proc-idle-timeout.phpt @@ -1,7 +1,5 @@ --TEST-- FPM: Process manager config pm.process_idle_timeout ---XFAIL-- -Frequently fails in CI --SKIPIF-- Date: Sat, 7 Mar 2026 13:27:04 +0000 Subject: [PATCH 4/6] ext/session: Fix memory leak due to multiple exception happening during session abort Closes GH-21200 Co-authored-by: arshidkv12 --- NEWS | 4 +++ ext/session/session.c | 11 +++++- ...sessionhandler_validateid_return_type.phpt | 35 +++++++++++++++++++ .../session_set_save_handler_class_012.phpt | 2 ++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 ext/session/tests/sessionhandler_validateid_return_type.phpt diff --git a/NEWS b/NEWS index 5ccf063672d2..abe3cc9efb87 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,10 @@ PHP NEWS . Fixed re-entrancy issue on php_pcre_match_impl, php_pcre_replace_impl, php_pcre_split_impl, and php_pcre_grep_impl. (David Carlier) +- Session: + . Fix memory leak due to multiple exception happening during session abort. + (arshidkv12) + - SNMP: . Fixed bug GH-21336 (SNMP::setSecurity() undefined behavior with NULL arguments). (David Carlier) diff --git a/ext/session/session.c b/ext/session/session.c index 70e1673d87f5..f8d963b48947 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -41,6 +41,7 @@ #include "ext/standard/url_scanner_ex.h" #include "ext/standard/info.h" #include "zend_smart_str.h" +#include "zend_exceptions.h" #include "ext/standard/url.h" #include "ext/standard/basic_functions.h" #include "ext/standard/head.h" @@ -1743,8 +1744,16 @@ PHPAPI php_session_status php_get_session_status(void) static zend_result php_session_abort(void) /* {{{ */ { if (PS(session_status) == php_session_active) { - if (PS(mod_data) || PS(mod_user_implemented)) { + if ((PS(mod_data) || PS(mod_user_implemented)) && PS(mod)->s_close) { + zend_object *old_exception = EG(exception); + EG(exception) = NULL; + PS(mod)->s_close(&PS(mod_data)); + if (!EG(exception)) { + EG(exception) = old_exception; + } else if (old_exception) { + zend_exception_set_previous(EG(exception), old_exception); + } } PS(session_status) = php_session_none; return SUCCESS; diff --git a/ext/session/tests/sessionhandler_validateid_return_type.phpt b/ext/session/tests/sessionhandler_validateid_return_type.phpt new file mode 100644 index 000000000000..a10069458820 --- /dev/null +++ b/ext/session/tests/sessionhandler_validateid_return_type.phpt @@ -0,0 +1,35 @@ +--TEST-- +SessionHandler::validateId must return bool +--INI-- +session.use_strict_mode=1 +--EXTENSIONS-- +session +--SKIPIF-- + +--FILE-- +getMessage(), "\n"; +} + +session_write_close(); + +try { + session_start(); +} catch (Throwable $e) { + echo $e->getMessage(), "\n"; +} +?> +--EXPECTF-- +Session id must be a string diff --git a/ext/session/tests/user_session_module/session_set_save_handler_class_012.phpt b/ext/session/tests/user_session_module/session_set_save_handler_class_012.phpt index f96206efbb64..a532dff7f821 100644 --- a/ext/session/tests/user_session_module/session_set_save_handler_class_012.phpt +++ b/ext/session/tests/user_session_module/session_set_save_handler_class_012.phpt @@ -43,6 +43,8 @@ var_dump(session_id(), $oldHandler, ini_get('session.save_handler'), $handler->i --EXPECTF-- *** Testing session_set_save_handler() : incorrect arguments for existing handler open *** Open: + +Warning: SessionHandler::close(): Parent session handler is not open in %s on line %d SessionHandler::open() expects exactly 2 arguments, 0 given Warning: Undefined global variable $_SESSION in %s on line %d From f830fa994896c972d4528bb23156ec65153c1805 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Sat, 7 Mar 2026 14:09:49 +0000 Subject: [PATCH 5/6] Sockets refactoring 2026 (#21365) ext/sockets: internal refactorings. - remove redundant memsets and faster socket unix path copy. - simplify php_open_listen_sock. - use INADDR_ANY directly instead of resolving via gethostbyname. - remove redundant memsets in conversions. --- ext/sockets/conversions.c | 7 ++----- ext/sockets/sockets.c | 18 +++--------------- .../tests/socket_create_listen-win32.phpt | 2 +- 3 files changed, 6 insertions(+), 21 deletions(-) diff --git a/ext/sockets/conversions.c b/ext/sockets/conversions.c index b4a13f39cd9c..1c735ef5e6d8 100644 --- a/ext/sockets/conversions.c +++ b/ext/sockets/conversions.c @@ -571,7 +571,6 @@ static void to_zval_read_sin_addr(const char *data, zval *zv, res_context *ctx) const struct in_addr *addr = (const struct in_addr *)data; socklen_t size = INET_ADDRSTRLEN; zend_string *str = zend_string_alloc(size - 1, 0); - memset(ZSTR_VAL(str), '\0', size); ZVAL_NEW_STR(zv, str); @@ -581,7 +580,7 @@ static void to_zval_read_sin_addr(const char *data, zval *zv, res_context *ctx) return; } - Z_STRLEN_P(zv) = strlen(Z_STRVAL_P(zv)); + Z_STR_P(zv) = zend_string_truncate(Z_STR_P(zv), strlen(Z_STRVAL_P(zv)), 0); } static const field_descriptor descriptors_sockaddr_in[] = { {"family", sizeof("family"), false, offsetof(struct sockaddr_in, sin_family), from_zval_write_sa_family, to_zval_read_sa_family}, @@ -622,8 +621,6 @@ static void to_zval_read_sin6_addr(const char *data, zval *zv, res_context *ctx) socklen_t size = INET6_ADDRSTRLEN; zend_string *str = zend_string_alloc(size - 1, 0); - memset(ZSTR_VAL(str), '\0', size); - ZVAL_NEW_STR(zv, str); if (inet_ntop(AF_INET6, addr, Z_STRVAL_P(zv), size) == NULL) { @@ -632,7 +629,7 @@ static void to_zval_read_sin6_addr(const char *data, zval *zv, res_context *ctx) return; } - Z_STRLEN_P(zv) = strlen(Z_STRVAL_P(zv)); + Z_STR_P(zv) = zend_string_truncate(Z_STR_P(zv), strlen(Z_STRVAL_P(zv)), 0); } static const field_descriptor descriptors_sockaddr_in6[] = { {"family", sizeof("family"), false, offsetof(struct sockaddr_in6, sin6_family), from_zval_write_sa_family, to_zval_read_sa_family}, diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 838e99cdc137..464bd87d5d30 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -244,18 +244,9 @@ ZEND_GET_MODULE(sockets) static bool php_open_listen_sock(php_socket *sock, unsigned short port, int backlog) /* {{{ */ { struct sockaddr_in la = {0}; - struct hostent *hp; -#ifndef PHP_WIN32 - if ((hp = php_network_gethostbyname("0.0.0.0")) == NULL) { -#else - if ((hp = php_network_gethostbyname("localhost")) == NULL) { -#endif - return false; - } - - memcpy((char *) &la.sin_addr, hp->h_addr, hp->h_length); - la.sin_family = hp->h_addrtype; + la.sin_addr.s_addr = htonl(INADDR_ANY); + la.sin_family = AF_INET; la.sin_port = htons(port); sock->bsd_socket = socket(PF_INET, SOCK_STREAM, 0); @@ -1249,8 +1240,6 @@ PHP_FUNCTION(socket_connect) RETURN_THROWS(); } - memset(&sin6, 0, sizeof(struct sockaddr_in6)); - sin6.sin6_family = AF_INET6; sin6.sin6_port = htons((unsigned short int)port); @@ -1629,7 +1618,6 @@ PHP_FUNCTION(socket_recvfrom) ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - memset(addrbuf, 0, INET6_ADDRSTRLEN); inet_ntop(AF_INET6, &sin6.sin6_addr, addrbuf, sizeof(addrbuf)); ZEND_TRY_ASSIGN_REF_NEW_STR(arg2, recv_buf); @@ -1732,7 +1720,7 @@ PHP_FUNCTION(socket_sendto) } s_un.sun_family = AF_UNIX; - snprintf(s_un.sun_path, sizeof(s_un.sun_path), "%s", ZSTR_VAL(addr)); + memcpy(s_un.sun_path, ZSTR_VAL(addr), ZSTR_LEN(addr) + 1); retval = sendto(php_sock->bsd_socket, buf, ((size_t)len > buf_len) ? buf_len : (size_t)len, flags, (struct sockaddr *) &s_un, SUN_LEN(&s_un)); break; diff --git a/ext/sockets/tests/socket_create_listen-win32.phpt b/ext/sockets/tests/socket_create_listen-win32.phpt index 74e6d73212f1..bbdc3b1ee9de 100644 --- a/ext/sockets/tests/socket_create_listen-win32.phpt +++ b/ext/sockets/tests/socket_create_listen-win32.phpt @@ -15,7 +15,7 @@ socket_getsockname($sock, $addr, $port); var_dump($addr, $port); ?> --EXPECT-- -string(9) "127.0.0.1" +string(7) "0.0.0.0" int(31338) --CREDITS-- Till Klampaeckel, till@php.net From 58acc671db5a8c4d968df7a1b390889b02b809f9 Mon Sep 17 00:00:00 2001 From: Peter Kokot Date: Sat, 7 Mar 2026 16:16:59 +0100 Subject: [PATCH 6/6] ext/mbstring: Fix deprecation warning (#21363) This fixes the PHP deprecation warning: PHP Deprecated: Implicit conversion from float 2048.96875 to int loses precision in .../ext/mbstring/gen_rare_cp_bitvec.php on line 9 --- ext/mbstring/gen_rare_cp_bitvec.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/gen_rare_cp_bitvec.php b/ext/mbstring/gen_rare_cp_bitvec.php index ca1e85cb3d89..6f71fd1a2f83 100755 --- a/ext/mbstring/gen_rare_cp_bitvec.php +++ b/ext/mbstring/gen_rare_cp_bitvec.php @@ -6,7 +6,7 @@ return; } -$bitvec = array_fill(0, (0xFFFF / 32) + 1, 0xFFFFFFFF); +$bitvec = array_fill(0, intdiv(0xFFFF, 32) + 1, 0xFFFFFFFF); $input = file_get_contents($argv[1]); foreach (explode("\n", $input) as $line) {