mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Fix #79091: heap use-after-free in session_create_id()
If the `new_id` is released, we must not use it again.
This commit is contained in:
parent
864f5ef12f
commit
f79c774274
2 changed files with 68 additions and 0 deletions
|
@ -2198,6 +2198,7 @@ static PHP_FUNCTION(session_create_id)
|
|||
/* Detect collision and retry */
|
||||
if (PS(mod)->s_validate_sid(&PS(mod_data), new_id) == FAILURE) {
|
||||
zend_string_release(new_id);
|
||||
new_id = NULL;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
|
67
ext/session/tests/bug79091.phpt
Normal file
67
ext/session/tests/bug79091.phpt
Normal file
|
@ -0,0 +1,67 @@
|
|||
--TEST--
|
||||
Bug #79091 (heap use-after-free in session_create_id())
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('session')) die('skip session extension not available');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
class MySessionHandler implements SessionHandlerInterface, SessionIdInterface, SessionUpdateTimestampHandlerInterface
|
||||
{
|
||||
public function close()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function destroy($session_id)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function gc($maxlifetime)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function open($save_path, $session_name)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function read($session_id)
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
public function write($session_id, $session_data)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function create_sid()
|
||||
{
|
||||
return uniqid();
|
||||
}
|
||||
|
||||
public function updateTimestamp($key, $val)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function validateId($key)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
ob_start();
|
||||
var_dump(session_set_save_handler(new MySessionHandler()));
|
||||
var_dump(session_start());
|
||||
ob_flush();
|
||||
session_create_id();
|
||||
?>
|
||||
--EXPECTF--
|
||||
bool(true)
|
||||
bool(true)
|
||||
|
||||
Warning: session_create_id(): Failed to create new ID in %s on line %d
|
Loading…
Add table
Add a link
Reference in a new issue