diff --git a/NEWS b/NEWS index 474db936ef15..549bb342c3f7 100644 --- a/NEWS +++ b/NEWS @@ -41,6 +41,8 @@ PHP NEWS . Fix corruption in mod_mm. (ndossche) . Fixed bug GH-23043 (broken session id code can cause zend_mm_heap corrupted). (ndossche) + . Fixed bug GH-23061 (SessionHandler::create_sid() callback failure leaks + memory in debug build). (Lazizbek Ergashev) - Sockets: . Fixed various memory related issues in ext/sockets. (David Carlier) diff --git a/ext/session/session.c b/ext/session/session.c index 6380505ae951..a6b65ff57f18 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -145,6 +145,14 @@ static void php_rshutdown_session_globals(void) /* {{{ */ PS(mod)->s_close(&PS(mod_data)); } zend_end_try(); } + /* The user handler may not have closed the default handler it opened, e.g. because a pending + * exception prevented its close callback from running at all */ + if (PS(mod_user_is_open)) { + zend_try { + PS(default_mod)->s_close(&PS(mod_data)); + } zend_end_try(); + PS(mod_user_is_open) = false; + } if (PS(id)) { zend_string_release_ex(PS(id), 0); PS(id) = NULL; diff --git a/ext/session/tests/user_session_module/gh23061.phpt b/ext/session/tests/user_session_module/gh23061.phpt new file mode 100644 index 000000000000..f3756e3462d0 --- /dev/null +++ b/ext/session/tests/user_session_module/gh23061.phpt @@ -0,0 +1,21 @@ +--TEST-- +GH-23061 (SessionHandler::create_sid() callback failure leaks memory in debug build) +--EXTENSIONS-- +session +--FILE-- +getMessage(), "\n"; +} +?> +--EXPECT-- +Error: Session id must be a string