[php-src] master: Merge branch 'PHP-8.6'

From: Date: Mon, 12 Oct 2026 10:44:26 +0000
Subject: [php-src] master: Merge branch 'PHP-8.6'
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-142201@lists.php.net to get a copy of this message
Author: Ilia Alshanetsky (iliaal) Date: 2026-10-12T06:43:29-04:00 Commit: https://github.com/php/php-src/commit/80d2b997192573df0725e593683718538aac01b7 Raw diff: https://github.com/php/php-src/commit/80d2b997192573df0725e593683718538aac01b7.diff Merge branch 'PHP-8.6' * PHP-8.6: ext/session: Close save handler when session encoding fails Changed paths: A ext/session/tests/session_write_close_encode_failure.phpt M ext/session/session.c Diff: diff --git a/ext/session/session.c b/ext/session/session.c index 23efb3cee7d7..6300f0cd9fd9 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -526,6 +526,7 @@ static void php_session_save_current_state(bool write) /* Not being able to encode the session data means there is some kind of issue that prevents a write * (e.g. a key containing the '|' character with the default serialization) */ if (UNEXPECTED(val == NULL)) { + PS(mod)->s_close(&PS(mod_data)); return; } diff --git a/ext/session/tests/session_write_close_encode_failure.phpt b/ext/session/tests/session_write_close_encode_failure.phpt new file mode 100644 index 000000000000..1c562f401df2 --- /dev/null +++ b/ext/session/tests/session_write_close_encode_failure.phpt @@ -0,0 +1,76 @@ +--TEST-- +session_write_close() closes the save handler when encoding the session data fails +--EXTENSIONS-- +session +--SKIPIF-- +<?php include('skipif.inc'); ?> +--INI-- +session.use_cookies=0 +session.cache_limiter= +session.serialize_handler=php +session.save_handler=files +--FILE-- +<?php +ob_start(); +$dir = __DIR__ . '/session_write_close_encode_failure'; +@mkdir($dir); +session_save_path($dir); +session_start(); +$file = $dir . '/sess_' . session_id(); +$_SESSION['bad|key'] = 'value'; +var_dump(session_write_close()); + +$fp = fopen($file, 'r'); +var_dump(flock($fp, LOCK_EX | LOCK_NB)); +fclose($fp); + +session_start(); +$file = $dir . '/sess_' . session_id(); +$_SESSION['closure'] = function () {}; +$_SESSION['bad|key'] = 'value'; +try { + session_write_close(); +} catch (Exception $e) { + echo $e::class, ": ", $e->getMessage(), PHP_EOL; +} + +$fp = fopen($file, 'r'); +var_dump(flock($fp, LOCK_EX | LOCK_NB)); +fclose($fp); + +class Handler extends SessionHandler +{ + public function close(): bool + { + echo "close\n"; + return parent::close(); + } +} + +session_set_save_handler(new Handler()); +session_start(); +$_SESSION['bad|key'] = 'value'; +var_dump(session_write_close()); +echo "done\n"; +?> +--CLEAN-- +<?php +$dir = __DIR__ . '/session_write_close_encode_failure'; +foreach (glob($dir . '/sess_*') as $file) { + unlink($file); +} +@rmdir($dir); +?> +--EXPECTF-- +Warning: session_write_close(): Failed to write session data. Data contains invalid key "bad|key" in %s on line %d +bool(true) +bool(true) + +Warning: session_write_close(): Failed to write session data. Data contains invalid key "bad|key" in %s on line %d +Exception: Serialization of 'Closure' is not allowed +bool(true) + +Warning: session_write_close(): Failed to write session data. Data contains invalid key "bad|key" in %s on line %d +close +bool(true) +done

« previous php.cvs (#142201) next »