diff options
Diffstat (limited to 'ext/session')
-rw-r--r-- | ext/session/mod_files.c | 4 | ||||
-rw-r--r-- | ext/session/mod_mm.c | 4 | ||||
-rw-r--r-- | ext/session/mod_user.c | 2 | ||||
-rw-r--r-- | ext/session/session.c | 43 | ||||
-rw-r--r-- | ext/session/tests/bug65475.phpt | 34 | ||||
-rw-r--r-- | ext/session/tests/rfc1867.phpt | 1 | ||||
-rw-r--r-- | ext/session/tests/rfc1867_cleanup.phpt | 1 | ||||
-rw-r--r-- | ext/session/tests/rfc1867_disabled.phpt | 1 | ||||
-rw-r--r-- | ext/session/tests/rfc1867_disabled_2.phpt | 1 | ||||
-rw-r--r-- | ext/session/tests/rfc1867_inter.phpt | 1 | ||||
-rw-r--r-- | ext/session/tests/rfc1867_no_name.phpt | 1 | ||||
-rw-r--r-- | ext/session/tests/rfc1867_sid_cookie.phpt | 1 | ||||
-rw-r--r-- | ext/session/tests/rfc1867_sid_get.phpt | 1 | ||||
-rw-r--r-- | ext/session/tests/rfc1867_sid_get_2.phpt | 1 | ||||
-rw-r--r-- | ext/session/tests/rfc1867_sid_only_cookie.phpt | 1 | ||||
-rw-r--r-- | ext/session/tests/rfc1867_sid_post.phpt | 1 | ||||
-rw-r--r-- | ext/session/tests/session_decode_basic_serialize.phpt | 274 | ||||
-rw-r--r-- | ext/session/tests/session_encode_serialize.phpt | 24 | ||||
-rw-r--r-- | ext/session/tests/session_id_basic.phpt | 2 |
19 files changed, 391 insertions, 7 deletions
diff --git a/ext/session/mod_files.c b/ext/session/mod_files.c index e5733b44f..004d9d463 100644 --- a/ext/session/mod_files.c +++ b/ext/session/mod_files.c @@ -338,13 +338,13 @@ PS_READ_FUNC(files) if (!PS(id)) { return FAILURE; } - php_session_reset_id(TSRMLS_C); if (PS(use_cookies)) { PS(send_cookie) = 1; } + php_session_reset_id(TSRMLS_C); } - ps_files_open(data, key TSRMLS_CC); + ps_files_open(data, PS(id) TSRMLS_CC); if (data->fd < 0) { return FAILURE; } diff --git a/ext/session/mod_mm.c b/ext/session/mod_mm.c index 69c0da7bd..3d37b981b 100644 --- a/ext/session/mod_mm.c +++ b/ext/session/mod_mm.c @@ -367,13 +367,13 @@ PS_READ_FUNC(mm) if (!PS(id)) { return FAILURE; } - php_session_reset_id(TSRMLS_C); if (PS(use_cookies)) { PS(send_cookie) = 1; } + php_session_reset_id(TSRMLS_C); } - sd = ps_sd_lookup(data, key, 0); + sd = ps_sd_lookup(data, PS(id), 0); if (sd) { *vallen = sd->datalen; *val = emalloc(sd->datalen + 1); diff --git a/ext/session/mod_user.c b/ext/session/mod_user.c index 82fd419fc..1b606b9a3 100644 --- a/ext/session/mod_user.c +++ b/ext/session/mod_user.c @@ -188,7 +188,7 @@ PS_CREATE_SID_FUNC(user) /* maintain backwards compatibility */ if (PSF(create_sid) != NULL) { char *id = NULL; - STDVARS; + zval *retval = NULL; retval = ps_call_handler(PSF(create_sid), 0, NULL TSRMLS_CC); diff --git a/ext/session/session.c b/ext/session/session.c index 7c6672de5..7bb658462 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -827,6 +827,44 @@ PHP_INI_END() /* *************** * Serializers * *************** */ +PS_SERIALIZER_ENCODE_FUNC(php_serialize) /* {{{ */ +{ + smart_str buf = {0}; + php_serialize_data_t var_hash; + + PHP_VAR_SERIALIZE_INIT(var_hash); + php_var_serialize(&buf, &PS(http_session_vars), &var_hash TSRMLS_CC); + PHP_VAR_SERIALIZE_DESTROY(var_hash); + if (newlen) { + *newlen = buf.len; + } + smart_str_0(&buf); + *newstr = buf.c; + return SUCCESS; +} +/* }}} */ + +PS_SERIALIZER_DECODE_FUNC(php_serialize) /* {{{ */ +{ + const char *endptr = val + vallen; + zval *session_vars; + php_unserialize_data_t var_hash; + + PHP_VAR_UNSERIALIZE_INIT(var_hash); + ALLOC_INIT_ZVAL(session_vars); + php_var_unserialize(&session_vars, &val, endptr, &var_hash TSRMLS_CC); + PHP_VAR_UNSERIALIZE_DESTROY(var_hash); + if (PS(http_session_vars)) { + zval_ptr_dtor(&PS(http_session_vars)); + } + if (Z_TYPE_P(session_vars) == IS_NULL) { + array_init(session_vars); + } + PS(http_session_vars) = session_vars; + ZEND_SET_GLOBAL_VAR_WITH_LENGTH("_SESSION", sizeof("_SESSION"), PS(http_session_vars), 2, 1); + return SUCCESS; +} +/* }}} */ #define PS_BIN_NR_OF_BITS 8 #define PS_BIN_UNDEF (1<<(PS_BIN_NR_OF_BITS-1)) @@ -1008,10 +1046,11 @@ break_outer_loop: } /* }}} */ -#define MAX_SERIALIZERS 10 -#define PREDEFINED_SERIALIZERS 2 +#define MAX_SERIALIZERS 32 +#define PREDEFINED_SERIALIZERS 3 static ps_serializer ps_serializers[MAX_SERIALIZERS + 1] = { + PS_SERIALIZER_ENTRY(php_serialize), PS_SERIALIZER_ENTRY(php), PS_SERIALIZER_ENTRY(php_binary) }; diff --git a/ext/session/tests/bug65475.phpt b/ext/session/tests/bug65475.phpt new file mode 100644 index 000000000..7dc546387 --- /dev/null +++ b/ext/session/tests/bug65475.phpt @@ -0,0 +1,34 @@ +--TEST-- +Bug #65475: Session ID is not initialized when session.usr_strict_mode=1 +--INI-- +session.save_handler=files +session.name=PHPSESSID +--SKIPIF-- +<?php include('skipif.inc'); ?> +--FILE-- +<?php +ob_start(); + +echo "Testing file module".PHP_EOL; +session_start(); +$_SESSION['foo'] = 1234; +$_SESSION['cnt'] = 1; +$session_id = session_id(); +session_write_close(); + +session_start(); +var_dump($session_id === session_id()); +$_SESSION['cnt']++; +session_write_close(); + +session_start(); +var_dump($session_id === session_id()); +var_dump($_SESSION['cnt']); // Should be int(2) +session_write_close(); + +--EXPECTF-- +Testing file module +bool(true) +bool(true) +int(2) + diff --git a/ext/session/tests/rfc1867.phpt b/ext/session/tests/rfc1867.phpt index dc44e8b44..6b14bcb4e 100644 --- a/ext/session/tests/rfc1867.phpt +++ b/ext/session/tests/rfc1867.phpt @@ -7,6 +7,7 @@ comment=debug builds show some additional E_NOTICE errors upload_max_filesize=1024 session.save_path= session.name=PHPSESSID +session.use_strict_mode=0 session.use_cookies=1 session.use_only_cookies=0 session.upload_progress.enabled=1 diff --git a/ext/session/tests/rfc1867_cleanup.phpt b/ext/session/tests/rfc1867_cleanup.phpt index f70b395d2..f84385bad 100644 --- a/ext/session/tests/rfc1867_cleanup.phpt +++ b/ext/session/tests/rfc1867_cleanup.phpt @@ -7,6 +7,7 @@ comment=debug builds show some additional E_NOTICE errors upload_max_filesize=1024 session.save_path= session.name=PHPSESSID +session.use_strict_mode=0 session.use_cookies=1 session.use_only_cookies=0 session.upload_progress.enabled=1 diff --git a/ext/session/tests/rfc1867_disabled.phpt b/ext/session/tests/rfc1867_disabled.phpt index 449005579..550ee3a7a 100644 --- a/ext/session/tests/rfc1867_disabled.phpt +++ b/ext/session/tests/rfc1867_disabled.phpt @@ -7,6 +7,7 @@ comment=debug builds show some additional E_NOTICE errors upload_max_filesize=1024 session.save_path= session.name=PHPSESSID +session.use_strict_mode=0 session.use_cookies=1 session.use_only_cookies=0 session.upload_progress.enabled=0 diff --git a/ext/session/tests/rfc1867_disabled_2.phpt b/ext/session/tests/rfc1867_disabled_2.phpt index e878f4619..83e97eeed 100644 --- a/ext/session/tests/rfc1867_disabled_2.phpt +++ b/ext/session/tests/rfc1867_disabled_2.phpt @@ -7,6 +7,7 @@ comment=debug builds show some additional E_NOTICE errors upload_max_filesize=1024 session.save_path= session.name=PHPSESSID +session.use_strict_mode=0 session.use_cookies=1 session.use_only_cookies=0 session.upload_progress.enabled=1 diff --git a/ext/session/tests/rfc1867_inter.phpt b/ext/session/tests/rfc1867_inter.phpt index 768637105..4d9b26223 100644 --- a/ext/session/tests/rfc1867_inter.phpt +++ b/ext/session/tests/rfc1867_inter.phpt @@ -7,6 +7,7 @@ comment=debug builds show some additional E_NOTICE errors upload_max_filesize=1024 session.save_path= session.name=PHPSESSID +session.use_strict_mode=0 session.use_cookies=1 session.use_only_cookies=0 session.upload_progress.enabled=1 diff --git a/ext/session/tests/rfc1867_no_name.phpt b/ext/session/tests/rfc1867_no_name.phpt index c1dda8156..d68a61d92 100644 --- a/ext/session/tests/rfc1867_no_name.phpt +++ b/ext/session/tests/rfc1867_no_name.phpt @@ -7,6 +7,7 @@ comment=debug builds show some additional E_NOTICE errors upload_max_filesize=1024 session.save_path= session.name=PHPSESSID +session.use_strict_mode=0 session.use_cookies=1 session.use_only_cookies=0 session.upload_progress.enabled=1 diff --git a/ext/session/tests/rfc1867_sid_cookie.phpt b/ext/session/tests/rfc1867_sid_cookie.phpt index 735a5ac20..286479933 100644 --- a/ext/session/tests/rfc1867_sid_cookie.phpt +++ b/ext/session/tests/rfc1867_sid_cookie.phpt @@ -7,6 +7,7 @@ comment=debug builds show some additional E_NOTICE errors upload_max_filesize=1024 session.save_path= session.name=PHPSESSID +session.use_strict_mode=0 session.use_cookies=1 session.use_only_cookies=0 session.upload_progress.enabled=1 diff --git a/ext/session/tests/rfc1867_sid_get.phpt b/ext/session/tests/rfc1867_sid_get.phpt index cc5a793e7..e3a48a1c1 100644 --- a/ext/session/tests/rfc1867_sid_get.phpt +++ b/ext/session/tests/rfc1867_sid_get.phpt @@ -7,6 +7,7 @@ comment=debug builds show some additional E_NOTICE errors upload_max_filesize=1024 session.save_path= session.name=PHPSESSID +session.use_strict_mode=0 session.use_cookies=1 session.use_only_cookies=0 session.upload_progress.enabled=1 diff --git a/ext/session/tests/rfc1867_sid_get_2.phpt b/ext/session/tests/rfc1867_sid_get_2.phpt index 1d22e5930..e21ca4ca2 100644 --- a/ext/session/tests/rfc1867_sid_get_2.phpt +++ b/ext/session/tests/rfc1867_sid_get_2.phpt @@ -7,6 +7,7 @@ comment=debug builds show some additional E_NOTICE errors upload_max_filesize=1024 session.save_path= session.name=PHPSESSID +session.use_strict_mode=0 session.use_cookies=0 session.use_only_cookies=0 session.upload_progress.enabled=1 diff --git a/ext/session/tests/rfc1867_sid_only_cookie.phpt b/ext/session/tests/rfc1867_sid_only_cookie.phpt index 9a0105668..41f6761fb 100644 --- a/ext/session/tests/rfc1867_sid_only_cookie.phpt +++ b/ext/session/tests/rfc1867_sid_only_cookie.phpt @@ -7,6 +7,7 @@ comment=debug builds show some additional E_NOTICE errors upload_max_filesize=1024 session.save_path= session.name=PHPSESSID +session.use_strict_mode=0 session.use_cookies=1 session.use_only_cookies=1 session.upload_progress.enabled=1 diff --git a/ext/session/tests/rfc1867_sid_post.phpt b/ext/session/tests/rfc1867_sid_post.phpt index 7c1eb2de5..107957f8d 100644 --- a/ext/session/tests/rfc1867_sid_post.phpt +++ b/ext/session/tests/rfc1867_sid_post.phpt @@ -7,6 +7,7 @@ comment=debug builds show some additional E_NOTICE errors upload_max_filesize=1024 session.save_path= session.name=PHPSESSID +session.use_strict_mode=0 session.use_cookies=1 session.use_only_cookies=0 session.upload_progress.enabled=1 diff --git a/ext/session/tests/session_decode_basic_serialize.phpt b/ext/session/tests/session_decode_basic_serialize.phpt new file mode 100644 index 000000000..dd88438e1 --- /dev/null +++ b/ext/session/tests/session_decode_basic_serialize.phpt @@ -0,0 +1,274 @@ +--TEST-- +Test session_decode() function : basic functionality +--SKIPIF-- +<?php include('skipif.inc'); ?> +--FILE-- +<?php + +ob_start(); + +/* + * Prototype : string session_decode(void) + * Description : Decodes session data from a string + * Source code : ext/session/session.c + */ + +echo "*** Testing session_decode() : basic functionality ***\n"; + +// Get an unset variable +$unset_var = 10; +unset($unset_var); + +class classA +{ + public function __toString() { + return "Hello World!"; + } +} + +$heredoc = <<<EOT +Hello World! +EOT; + +$fp = fopen(__FILE__, "r"); + +// Unexpected values to be passed as arguments +$inputs = array( + + // Integer data +/*1*/ 0, + 1, + 12345, + -2345, + + // Float data +/*5*/ 10.5, + -10.5, + 12.3456789000e10, + 12.3456789000E-10, + .5, + + // Null data +/*10*/ NULL, + null, + + // Boolean data +/*12*/ true, + false, + TRUE, + FALSE, + + // Empty strings +/*16*/ "", + '', + + // Invalid string data +/*18*/ "Nothing", + 'Nothing', + $heredoc, + + // Object data +/*21*/ new classA(), + + // Undefined data +/*22*/ @$undefined_var, + + // Unset data +/*23*/ @$unset_var, + + // Resource variable +/*24*/ $fp +); + +ini_set('session.serialize_handler', 'php_serialize'); +var_dump(session_start()); +$iterator = 1; +foreach($inputs as $input) { + echo "\n-- Iteration $iterator --\n"; + $_SESSION["data"] = $input; + $encoded = session_encode(); + var_dump(session_decode($encoded)); + var_dump($_SESSION); + $iterator++; +}; + +var_dump(session_destroy()); +fclose($fp); +echo "Done"; +ob_end_flush(); +?> +--EXPECTF-- +*** Testing session_decode() : basic functionality *** +bool(true) + +-- Iteration 1 -- +bool(true) +array(1) { + ["data"]=> + int(0) +} + +-- Iteration 2 -- +bool(true) +array(1) { + ["data"]=> + int(1) +} + +-- Iteration 3 -- +bool(true) +array(1) { + ["data"]=> + int(12345) +} + +-- Iteration 4 -- +bool(true) +array(1) { + ["data"]=> + int(-2345) +} + +-- Iteration 5 -- +bool(true) +array(1) { + ["data"]=> + float(10.5) +} + +-- Iteration 6 -- +bool(true) +array(1) { + ["data"]=> + float(-10.5) +} + +-- Iteration 7 -- +bool(true) +array(1) { + ["data"]=> + float(123456789000) +} + +-- Iteration 8 -- +bool(true) +array(1) { + ["data"]=> + float(1.23456789E-9) +} + +-- Iteration 9 -- +bool(true) +array(1) { + ["data"]=> + float(0.5) +} + +-- Iteration 10 -- +bool(true) +array(1) { + ["data"]=> + NULL +} + +-- Iteration 11 -- +bool(true) +array(1) { + ["data"]=> + NULL +} + +-- Iteration 12 -- +bool(true) +array(1) { + ["data"]=> + bool(true) +} + +-- Iteration 13 -- +bool(true) +array(1) { + ["data"]=> + bool(false) +} + +-- Iteration 14 -- +bool(true) +array(1) { + ["data"]=> + bool(true) +} + +-- Iteration 15 -- +bool(true) +array(1) { + ["data"]=> + bool(false) +} + +-- Iteration 16 -- +bool(true) +array(1) { + ["data"]=> + string(0) "" +} + +-- Iteration 17 -- +bool(true) +array(1) { + ["data"]=> + string(0) "" +} + +-- Iteration 18 -- +bool(true) +array(1) { + ["data"]=> + string(7) "Nothing" +} + +-- Iteration 19 -- +bool(true) +array(1) { + ["data"]=> + string(7) "Nothing" +} + +-- Iteration 20 -- +bool(true) +array(1) { + ["data"]=> + string(12) "Hello World!" +} + +-- Iteration 21 -- +bool(true) +array(1) { + ["data"]=> + object(classA)#2 (0) { + } +} + +-- Iteration 22 -- +bool(true) +array(1) { + ["data"]=> + NULL +} + +-- Iteration 23 -- +bool(true) +array(1) { + ["data"]=> + NULL +} + +-- Iteration 24 -- +bool(true) +array(1) { + ["data"]=> + int(0) +} +bool(true) +Done + diff --git a/ext/session/tests/session_encode_serialize.phpt b/ext/session/tests/session_encode_serialize.phpt new file mode 100644 index 000000000..41c79c3e5 --- /dev/null +++ b/ext/session/tests/session_encode_serialize.phpt @@ -0,0 +1,24 @@ +--TEST-- +Test session_encode() function : Numeric key raise error. bug65359 +--SKIPIF-- +<?php include('skipif.inc'); ?> +--FILE-- +<?php +ob_start(); + +ini_set('session.serialize_handler', 'php_serialize'); +var_dump(session_start()); +$_SESSION[-3] = 'foo'; +$_SESSION[3] = 'bar'; +$_SESSION['var'] = 123; +var_dump(session_encode()); +session_write_close(); + +// Should finish without errors +echo 'Done'.PHP_EOL; +?> +--EXPECTF-- +bool(true) +string(51) "a:3:{i:-3;s:3:"foo";i:3;s:3:"bar";s:3:"var";i:123;}" +Done + diff --git a/ext/session/tests/session_id_basic.phpt b/ext/session/tests/session_id_basic.phpt index 5cb13c25e..852d2f957 100644 --- a/ext/session/tests/session_id_basic.phpt +++ b/ext/session/tests/session_id_basic.phpt @@ -20,6 +20,8 @@ var_dump(session_id("test")); var_dump(session_id()); var_dump(session_id("1234567890")); var_dump(session_id()); +// Turn off strice mode, since it does not allow uninitialized session ID +ini_set('session.use_strict_mode',false); var_dump(session_start()); var_dump(session_id()); var_dump(session_destroy()); |