[PHP-CVS] [php-src] master: Add tests for session_regenerate_id() write/destroy failure paths (#22687)

[email protected] (Jorg Adam Sowa via GitHub) Mon, 3 Aug 2026 17:08:01 +0000
Newsgroups php.cvs
Message-ID <[email protected]>
Author: Jorg Adam Sowa (jorgsowa)
Committer: GitHub (web-flow)
Pusher: Girgias
Date: 2026-08-03T18:07:58+01:00

Commit: https://github.com/php/php-src/commit/84f789e6a50a57c9e825710d4ea83c50724395ad
Raw diff: https://github.com/php/php-src/commit/84f789e6a50a57c9e825710d4ea83c50724395ad.diff

Add tests for session_regenerate_id() write/destroy failure paths (#22687)

Covers the previously untested FAILURE branches where a userland
save handler's write() or destroy() returns false during
session_regenerate_id(), which should warn and return false while
leaving the current session ID untouched.

Changed paths:
  A  ext/session/tests/user_session_module/session_regenerate_id_destroy_fails.phpt
  A  ext/session/tests/user_session_module/session_regenerate_id_write_fails.phpt


Diff:

diff --git a/ext/session/tests/user_session_module/session_regenerate_id_destroy_fails.phpt b/ext/session/tests/user_session_module/session_regenerate_id_destroy_fails.phpt
new file mode 100644
index 000000000000..5ad41aeeacf7
--- /dev/null
+++ b/ext/session/tests/user_session_module/session_regenerate_id_destroy_fails.phpt
@@ -0,0 +1,50 @@
+--TEST--
+session_regenerate_id(true): warns and returns false when save handler's destroy() fails
+--EXTENSIONS--
+session
+--INI--
+session.save_path=
+--FILE--
+<?php
+
+class FailingDestroyHandler implements SessionHandlerInterface {
+    function open($save_path, $session_name): bool {
+        return true;
+    }
+
+    function close(): bool {
+        return true;
+    }
+
+    function read($id): string|false {
+        return '';
+    }
+
+    function write($id, $session_data): bool {
+        return true;
+    }
+
+    function destroy($id): bool {
+        return false;
+    }
+
+    function gc($maxlifetime): int|false {
+        return 0;
+    }
+}
+
+session_set_save_handler(new FailingDestroyHandler());
+session_start();
+$_SESSION['foo'] = 'bar';
+$old_id = session_id();
+
+var_dump(session_regenerate_id(true));
+var_dump(session_id() === $old_id);
+var_dump(session_status() === PHP_SESSION_NONE);
+
+?>
+--EXPECTF--
+Warning: session_regenerate_id(): Session object destruction failed. ID: user (path: ) in %s on line %d
+bool(false)
+bool(true)
+bool(true)
diff --git a/ext/session/tests/user_session_module/session_regenerate_id_write_fails.phpt b/ext/session/tests/user_session_module/session_regenerate_id_write_fails.phpt
new file mode 100644
index 000000000000..1f5c3f84099b
--- /dev/null
+++ b/ext/session/tests/user_session_module/session_regenerate_id_write_fails.phpt
@@ -0,0 +1,50 @@
+--TEST--
+session_regenerate_id(false): warns and returns false when save handler's write() fails
+--EXTENSIONS--
+session
+--INI--
+session.save_path=
+--FILE--
+<?php
+
+class FailingWriteHandler implements SessionHandlerInterface {
+    function open($save_path, $session_name): bool {
+        return true;
+    }
+
+    function close(): bool {
+        return true;
+    }
+
+    function read($id): string|false {
+        return '';
+    }
+
+    function write($id, $session_data): bool {
+        return false;
+    }
+
+    function destroy($id): bool {
+        return true;
+    }
+
+    function gc($maxlifetime): int|false {
+        return 0;
+    }
+}
+
+session_set_save_handler(new FailingWriteHandler());
+session_start();
+$_SESSION['foo'] = 'bar';
+$old_id = session_id();
+
+var_dump(session_regenerate_id(false));
+var_dump(session_id() === $old_id);
+var_dump(session_status() === PHP_SESSION_NONE);
+
+?>
+--EXPECTF--
+Warning: session_regenerate_id(): Session write failed. ID: user (path: ) in %s on line %d
+bool(false)
+bool(true)
+bool(true)