mirror of
https://github.com/php/php-src.git
synced 2025-08-16 14:08:47 +02:00
Merge branch 'PHP-5.6' into PHP-7.0
* PHP-5.6: Fixed Bug #71038 session_start() returns TRUE on failure
This commit is contained in:
commit
224aaf94af
15 changed files with 97 additions and 47 deletions
|
@ -97,6 +97,7 @@ zend_class_entry *php_session_update_timestamp_iface_entry;
|
||||||
#define APPLY_TRANS_SID (PS(use_trans_sid) && !PS(use_only_cookies))
|
#define APPLY_TRANS_SID (PS(use_trans_sid) && !PS(use_only_cookies))
|
||||||
|
|
||||||
static void php_session_send_cookie(void);
|
static void php_session_send_cookie(void);
|
||||||
|
static void php_session_abort(void);
|
||||||
|
|
||||||
/* Dispatched by RINIT and by php_session_destroy */
|
/* Dispatched by RINIT and by php_session_destroy */
|
||||||
static inline void php_rinit_session_globals(void) /* {{{ */
|
static inline void php_rinit_session_globals(void) /* {{{ */
|
||||||
|
@ -503,7 +504,10 @@ static void php_session_initialize(void) /* {{{ */
|
||||||
{
|
{
|
||||||
zend_string *val = NULL;
|
zend_string *val = NULL;
|
||||||
|
|
||||||
|
PS(session_status) = php_session_active;
|
||||||
|
|
||||||
if (!PS(mod)) {
|
if (!PS(mod)) {
|
||||||
|
PS(session_status) = php_session_disabled;
|
||||||
php_error_docref(NULL, E_ERROR, "No storage module chosen - failed to initialize session");
|
php_error_docref(NULL, E_ERROR, "No storage module chosen - failed to initialize session");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -512,6 +516,7 @@ static void php_session_initialize(void) /* {{{ */
|
||||||
if (PS(mod)->s_open(&PS(mod_data), PS(save_path), PS(session_name)) == FAILURE
|
if (PS(mod)->s_open(&PS(mod_data), PS(save_path), PS(session_name)) == FAILURE
|
||||||
/* || PS(mod_data) == NULL */ /* FIXME: open must set valid PS(mod_data) with success */
|
/* || PS(mod_data) == NULL */ /* FIXME: open must set valid PS(mod_data) with success */
|
||||||
) {
|
) {
|
||||||
|
php_session_abort();
|
||||||
php_error_docref(NULL, E_ERROR, "Failed to initialize storage module: %s (path: %s)", PS(mod)->s_name, PS(save_path));
|
php_error_docref(NULL, E_ERROR, "Failed to initialize storage module: %s (path: %s)", PS(mod)->s_name, PS(save_path));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -520,6 +525,7 @@ static void php_session_initialize(void) /* {{{ */
|
||||||
if (!PS(id)) {
|
if (!PS(id)) {
|
||||||
PS(id) = PS(mod)->s_create_sid(&PS(mod_data));
|
PS(id) = PS(mod)->s_create_sid(&PS(mod_data));
|
||||||
if (!PS(id)) {
|
if (!PS(id)) {
|
||||||
|
php_session_abort();
|
||||||
php_error_docref(NULL, E_ERROR, "Failed to create session ID: %s (path: %s)", PS(mod)->s_name, PS(save_path));
|
php_error_docref(NULL, E_ERROR, "Failed to create session ID: %s (path: %s)", PS(mod)->s_name, PS(save_path));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -541,7 +547,6 @@ static void php_session_initialize(void) /* {{{ */
|
||||||
}
|
}
|
||||||
|
|
||||||
php_session_reset_id();
|
php_session_reset_id();
|
||||||
PS(session_status) = php_session_active;
|
|
||||||
|
|
||||||
/* GC must be done before read */
|
/* GC must be done before read */
|
||||||
php_session_gc();
|
php_session_gc();
|
||||||
|
@ -549,11 +554,11 @@ static void php_session_initialize(void) /* {{{ */
|
||||||
/* Read data */
|
/* Read data */
|
||||||
php_session_track_init();
|
php_session_track_init();
|
||||||
if (PS(mod)->s_read(&PS(mod_data), PS(id), &val, PS(gc_maxlifetime)) == FAILURE) {
|
if (PS(mod)->s_read(&PS(mod_data), PS(id), &val, PS(gc_maxlifetime)) == FAILURE) {
|
||||||
|
php_session_abort();
|
||||||
/* Some broken save handler implementation returns FAILURE for non-existent session ID */
|
/* Some broken save handler implementation returns FAILURE for non-existent session ID */
|
||||||
/* It's better to raise error for this, but disabled error for better compatibility */
|
/* It's better to raise error for this, but disabled error for better compatibility */
|
||||||
/*
|
php_error_docref(NULL, E_WARNING, "Failed to read session data: %s (path: %s)", PS(mod)->s_name, PS(save_path));
|
||||||
php_error_docref(NULL, E_NOTICE, "Failed to read session data: %s (path: %s)", PS(mod)->s_name, PS(save_path));
|
return;
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
if (PS(session_vars)) {
|
if (PS(session_vars)) {
|
||||||
zend_string_release(PS(session_vars));
|
zend_string_release(PS(session_vars));
|
||||||
|
@ -1288,11 +1293,13 @@ static int php_session_cache_limiter(void) /* {{{ */
|
||||||
php_session_cache_limiter_t *lim;
|
php_session_cache_limiter_t *lim;
|
||||||
|
|
||||||
if (PS(cache_limiter)[0] == '\0') return 0;
|
if (PS(cache_limiter)[0] == '\0') return 0;
|
||||||
|
if (PS(session_status) != php_session_active) return -1;
|
||||||
|
|
||||||
if (SG(headers_sent)) {
|
if (SG(headers_sent)) {
|
||||||
const char *output_start_filename = php_output_get_start_filename();
|
const char *output_start_filename = php_output_get_start_filename();
|
||||||
int output_start_lineno = php_output_get_start_lineno();
|
int output_start_lineno = php_output_get_start_lineno();
|
||||||
|
|
||||||
|
php_session_abort();
|
||||||
if (output_start_filename) {
|
if (output_start_filename) {
|
||||||
php_error_docref(NULL, E_WARNING, "Cannot send session cache limiter - headers already sent (output started at %s:%d)", output_start_filename, output_start_lineno);
|
php_error_docref(NULL, E_WARNING, "Cannot send session cache limiter - headers already sent (output started at %s:%d)", output_start_filename, output_start_lineno);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -22,5 +22,5 @@ session_write_close();
|
||||||
print "I live\n";
|
print "I live\n";
|
||||||
?>
|
?>
|
||||||
--EXPECTF--
|
--EXPECTF--
|
||||||
Warning: session_write_close(): Failed to write session data (files). Please verify that the current setting of session.save_path is correct (123;:/really%scompletely:::/invalid;;,23123;213) in %s on line %d
|
Warning: session_start(): Failed to read session data: files (path: 123;:/really%scompletely:::/invalid;;,23123;213) in %s on line %d
|
||||||
I live
|
I live
|
||||||
|
|
|
@ -8,32 +8,34 @@ function output_html($ext) {
|
||||||
return strlen($ext);
|
return strlen($ext);
|
||||||
}
|
}
|
||||||
|
|
||||||
function open ($save_path, $session_name) {
|
function open ($save_path, $session_name) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function close() {
|
function close() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function read ($id) {
|
function read ($id) {
|
||||||
}
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
function write ($id, $sess_data) {
|
function write ($id, $sess_data) {
|
||||||
ob_start("output_html");
|
ob_start("output_html");
|
||||||
echo "laruence";
|
echo "laruence";
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function destroy ($id) {
|
function destroy ($id) {
|
||||||
}
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
function gc ($maxlifetime) {
|
function gc ($maxlifetime) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");
|
session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");
|
||||||
session_start();
|
session_start();
|
||||||
--EXPECTF--
|
--EXPECTF--
|
||||||
8
|
8
|
||||||
|
|
32
ext/session/tests/bug71186.phpt
Normal file
32
ext/session/tests/bug71186.phpt
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
--TEST--
|
||||||
|
Bug #71186 session.hash_function - algorithm changes
|
||||||
|
--SKIPIF--
|
||||||
|
<?php include('skipif.inc'); ?>
|
||||||
|
--INI--
|
||||||
|
session.hash_function=sha512
|
||||||
|
session.save_handler=files
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
ob_start();
|
||||||
|
ini_set('session.use_strict_mode', 1);
|
||||||
|
|
||||||
|
session_start();
|
||||||
|
$orig = session_id();
|
||||||
|
session_regenerate_id();
|
||||||
|
$new = session_id();
|
||||||
|
var_dump(strlen($orig),strlen($new));
|
||||||
|
session_commit();
|
||||||
|
|
||||||
|
ini_set('session.hash_function','sha1');
|
||||||
|
session_id('invalid');
|
||||||
|
session_start();
|
||||||
|
$orig = session_id();
|
||||||
|
session_regenerate_id();
|
||||||
|
$new = session_id();
|
||||||
|
var_dump(strlen($orig),strlen($new));
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
int(128)
|
||||||
|
int(128)
|
||||||
|
int(40)
|
||||||
|
int(40)
|
|
@ -47,13 +47,13 @@ session_destroy();
|
||||||
--EXPECTF--
|
--EXPECTF--
|
||||||
Warning: Unknown: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in Unknown on line 0
|
Warning: Unknown: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in Unknown on line 0
|
||||||
|
|
||||||
Warning: Unknown: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in Unknown on line 0
|
Warning: Unknown: Failed to read session data: files (path: ) in Unknown on line 0
|
||||||
|
|
||||||
Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct () in Unknown on line 0
|
Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct () in Unknown on line 0
|
||||||
|
|
||||||
Warning: Unknown: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in Unknown on line 0
|
Warning: Unknown: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in Unknown on line 0
|
||||||
|
|
||||||
Warning: Unknown: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in Unknown on line 0
|
Warning: Unknown: Failed to read session data: files (path: ) in Unknown on line 0
|
||||||
|
|
||||||
Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct () in Unknown on line 0
|
Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct () in Unknown on line 0
|
||||||
string(%d) "%s"
|
string(%d) "%s"
|
||||||
|
|
|
@ -33,8 +33,12 @@ ob_end_flush();
|
||||||
string(5) "/blah"
|
string(5) "/blah"
|
||||||
|
|
||||||
Warning: session_start(): open(%sblah%e%s, O_RDWR) failed: No such file or directory (2) in %s on line %d
|
Warning: session_start(): open(%sblah%e%s, O_RDWR) failed: No such file or directory (2) in %s on line %d
|
||||||
bool(true)
|
|
||||||
|
Warning: session_start(): Failed to read session data: files (path: %sblah) in %s on line %d
|
||||||
|
bool(false)
|
||||||
string(5) "/blah"
|
string(5) "/blah"
|
||||||
bool(true)
|
|
||||||
|
Warning: session_destroy(): Trying to destroy uninitialized session in %s on line %d
|
||||||
|
bool(false)
|
||||||
string(5) "/blah"
|
string(5) "/blah"
|
||||||
Done
|
Done
|
||||||
|
|
|
@ -33,8 +33,12 @@ ob_end_flush();
|
||||||
string(5) "/blah"
|
string(5) "/blah"
|
||||||
|
|
||||||
Warning: session_start(): open(%s, O_RDWR) failed: No such file or directory (2) in %s on line %d
|
Warning: session_start(): open(%s, O_RDWR) failed: No such file or directory (2) in %s on line %d
|
||||||
bool(true)
|
|
||||||
|
Warning: session_start(): Failed to read session data: files (path: %sblah) in %s on line %d
|
||||||
|
bool(false)
|
||||||
string(5) "/blah"
|
string(5) "/blah"
|
||||||
bool(true)
|
|
||||||
|
Warning: session_destroy(): Trying to destroy uninitialized session in %s on line %d
|
||||||
|
bool(false)
|
||||||
string(5) "/blah"
|
string(5) "/blah"
|
||||||
Done
|
Done
|
||||||
|
|
|
@ -34,7 +34,7 @@ class MySession2 extends SessionHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function read($id) {
|
public function read($id) {
|
||||||
return @file_get_contents($this->path . $id);
|
return (string)@file_get_contents($this->path . $id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function write($id, $data) {
|
public function write($id, $data) {
|
||||||
|
|
|
@ -33,7 +33,7 @@ class MySession6 extends SessionHandler {
|
||||||
|
|
||||||
$handler = new MySession6;
|
$handler = new MySession6;
|
||||||
session_set_save_handler($handler);
|
session_set_save_handler($handler);
|
||||||
session_start();
|
var_dump(session_start());
|
||||||
|
|
||||||
var_dump(session_id(), ini_get('session.save_handler'), $_SESSION);
|
var_dump(session_id(), ini_get('session.save_handler'), $_SESSION);
|
||||||
|
|
||||||
|
@ -45,13 +45,12 @@ session_unset();
|
||||||
*** Testing session_set_save_handler() : incomplete implementation ***
|
*** Testing session_set_save_handler() : incomplete implementation ***
|
||||||
|
|
||||||
Warning: SessionHandler::read(): Parent session handler is not open in %ssession_set_save_handler_class_005.php on line %d
|
Warning: SessionHandler::read(): Parent session handler is not open in %ssession_set_save_handler_class_005.php on line %d
|
||||||
|
|
||||||
|
Warning: SessionHandler::close(): Parent session handler is not open in %ssession_set_save_handler_class_005.php on line %d
|
||||||
|
|
||||||
|
Warning: session_start(): Failed to read session data: user (%s) in %ssession_set_save_handler_class_005.php on line %d
|
||||||
|
bool(false)
|
||||||
string(%d) "%s"
|
string(%d) "%s"
|
||||||
string(4) "user"
|
string(4) "user"
|
||||||
array(0) {
|
array(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Warning: SessionHandler::write(): Parent session handler is not open in %ssession_set_save_handler_class_005.php on line %d
|
|
||||||
|
|
||||||
Warning: session_write_close(): Failed to write session data %s in %ssession_set_save_handler_class_005.php on line %d
|
|
||||||
|
|
||||||
Warning: SessionHandler::close(): Parent session handler is not open in %ssession_set_save_handler_class_005.php on line %d
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ class MySession extends SessionHandler {
|
||||||
$oldHandler = ini_get('session.save_handler');
|
$oldHandler = ini_get('session.save_handler');
|
||||||
$handler = new MySession;
|
$handler = new MySession;
|
||||||
session_set_save_handler($handler);
|
session_set_save_handler($handler);
|
||||||
session_start();
|
var_dump(session_start());
|
||||||
|
|
||||||
var_dump(session_id(), $oldHandler, ini_get('session.save_handler'), $handler->i, $_SESSION);
|
var_dump(session_id(), $oldHandler, ini_get('session.save_handler'), $handler->i, $_SESSION);
|
||||||
|
|
||||||
|
@ -50,15 +50,14 @@ Warning: SessionHandler::open() expects exactly 2 parameters, 0 given in %s on l
|
||||||
Read %s
|
Read %s
|
||||||
|
|
||||||
Warning: SessionHandler::read(): Parent session handler is not open in %s on line %d
|
Warning: SessionHandler::read(): Parent session handler is not open in %s on line %d
|
||||||
|
|
||||||
|
Warning: SessionHandler::close(): Parent session handler is not open in %s on line %d
|
||||||
|
|
||||||
|
Warning: session_start(): Failed to read session data: user (%s) in %s on line %d
|
||||||
|
bool(false)
|
||||||
string(%d) "%s"
|
string(%d) "%s"
|
||||||
string(5) "files"
|
string(5) "files"
|
||||||
string(4) "user"
|
string(4) "user"
|
||||||
int(2)
|
int(2)
|
||||||
array(0) {
|
array(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Warning: SessionHandler::write(): Parent session handler is not open in Unknown on line 0
|
|
||||||
|
|
||||||
Warning: session_write_close(): Failed to write session data %s in %s on line %d
|
|
||||||
|
|
||||||
Warning: SessionHandler::close(): Parent session handler is not open in Unknown on line 0
|
|
||||||
|
|
|
@ -10,10 +10,10 @@ session.name=PHPSESSID
|
||||||
|
|
||||||
ob_start();
|
ob_start();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prototype : bool session_set_save_handler(SessionHandlerInterface $handler [, bool $register_shutdown_function = true])
|
* Prototype : bool session_set_save_handler(SessionHandlerInterface $handler [, bool $register_shutdown_function = true])
|
||||||
* Description : Sets user-level session storage functions
|
* Description : Sets user-level session storage functions
|
||||||
* Source code : ext/session/session.c
|
* Source code : ext/session/session.c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
echo "*** Testing session_set_save_handler() function: class with create_sid ***\n";
|
echo "*** Testing session_set_save_handler() function: class with create_sid ***\n";
|
||||||
|
@ -34,7 +34,7 @@ class MySession2 extends SessionHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function read($id) {
|
public function read($id) {
|
||||||
return @file_get_contents($this->path . $id);
|
return (string)@file_get_contents($this->path . $id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function write($id, $data) {
|
public function write($id, $data) {
|
||||||
|
|
|
@ -34,7 +34,7 @@ class MySession2 extends SessionHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function read($id) {
|
public function read($id) {
|
||||||
return @file_get_contents($this->path . $id);
|
return (string)@file_get_contents($this->path . $id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function write($id, $data) {
|
public function write($id, $data) {
|
||||||
|
|
|
@ -24,7 +24,7 @@ session_set_save_handler("callback", "callback", "callback", "echo", "callback",
|
||||||
session_set_save_handler("callback", "callback", "callback", "callback", "echo", "callback");
|
session_set_save_handler("callback", "callback", "callback", "callback", "echo", "callback");
|
||||||
session_set_save_handler("callback", "callback", "callback", "callback", "callback", "echo");
|
session_set_save_handler("callback", "callback", "callback", "callback", "callback", "echo");
|
||||||
session_set_save_handler("callback", "callback", "callback", "callback", "callback", "callback");
|
session_set_save_handler("callback", "callback", "callback", "callback", "callback", "callback");
|
||||||
session_start();
|
var_dump(session_start());
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
?>
|
?>
|
||||||
--EXPECTF--
|
--EXPECTF--
|
||||||
|
@ -39,3 +39,6 @@ Warning: session_set_save_handler(): Argument 4 is not a valid callback in %s on
|
||||||
Warning: session_set_save_handler(): Argument 5 is not a valid callback in %s on line %d
|
Warning: session_set_save_handler(): Argument 5 is not a valid callback in %s on line %d
|
||||||
|
|
||||||
Warning: session_set_save_handler(): Argument 6 is not a valid callback in %s on line %d
|
Warning: session_set_save_handler(): Argument 6 is not a valid callback in %s on line %d
|
||||||
|
|
||||||
|
Warning: session_start(): Failed to read session data: user (%s) in %s on line %d
|
||||||
|
bool(false)
|
||||||
|
|
|
@ -34,7 +34,7 @@ class MySession2 implements SessionHandlerInterface {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function read($id) {
|
public function read($id) {
|
||||||
return @file_get_contents($this->path . $id);
|
return (string)@file_get_contents($this->path . $id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function write($id, $data) {
|
public function write($id, $data) {
|
||||||
|
|
|
@ -43,7 +43,7 @@ class MySession2 implements MySessionHandlerInterface {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function read($id) {
|
public function read($id) {
|
||||||
return @file_get_contents($this->path . $id);
|
return (string)@file_get_contents($this->path . $id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function write($id, $data) {
|
public function write($id, $data) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue