summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--session.c21
-rw-r--r--tests/executor/user_session_handler.phpt87
2 files changed, 105 insertions, 3 deletions
diff --git a/session.c b/session.c
index 1045a93..e132c4c 100644
--- a/session.c
+++ b/session.c
@@ -728,7 +728,12 @@ static int suhosin_hook_s_read(void **mod_data, const char *key, char **val, int
728 }*/ 728 }*/
729 729
730 /* protect dumb session handlers */ 730 /* protect dumb session handlers */
731 if (key == NULL || !key[0] || *mod_data == NULL) { 731 if (key == NULL || !key[0] ||
732 (*mod_data == NULL
733#if PHP_VERSION_ID >= 50400
734 && !SESSION_G(mod_user_implemented)
735#endif
736 )) {
732regenerate: 737regenerate:
733 SDEBUG("regenerating key is %s", key); 738 SDEBUG("regenerating key is %s", key);
734 KEY = SESSION_G(id) = SESSION_G(mod)->s_create_sid(&SESSION_G(mod_data), NULL TSRMLS_CC); 739 KEY = SESSION_G(id) = SESSION_G(mod)->s_create_sid(&SESSION_G(mod_data), NULL TSRMLS_CC);
@@ -777,7 +782,12 @@ static int suhosin_hook_s_write(void **mod_data, const char *key, const char *va
777 char *v = (char *)val; 782 char *v = (char *)val;
778 783
779 /* protect dumb session handlers */ 784 /* protect dumb session handlers */
780 if (key == NULL || !key[0] || val == NULL || strlen(key) > SUHOSIN_G(session_max_id_length) || *mod_data == NULL) { 785 if (key == NULL || !key[0] || val == NULL || strlen(key) > SUHOSIN_G(session_max_id_length) ||
786 (*mod_data == NULL
787#if PHP_VERSION_ID >= 50400
788 && !SESSION_G(mod_user_implemented)
789#endif
790 )) {
781 r = FAILURE; 791 r = FAILURE;
782 goto return_write; 792 goto return_write;
783 } 793 }
@@ -820,7 +830,12 @@ static int suhosin_hook_s_destroy(void **mod_data, const char *key TSRMLS_DC)
820 int r; 830 int r;
821 831
822 /* protect dumb session handlers */ 832 /* protect dumb session handlers */
823 if (key == NULL || !key[0] || strlen(key) > SUHOSIN_G(session_max_id_length) || *mod_data == NULL) { 833 if (key == NULL || !key[0] || strlen(key) > SUHOSIN_G(session_max_id_length) ||
834 (*mod_data == NULL
835#if PHP_VERSION_ID >= 50400
836 && !SESSION_G(mod_user_implemented)
837#endif
838 )) {
824 return FAILURE; 839 return FAILURE;
825 } 840 }
826 841
diff --git a/tests/executor/user_session_handler.phpt b/tests/executor/user_session_handler.phpt
new file mode 100644
index 0000000..aa9d67c
--- /dev/null
+++ b/tests/executor/user_session_handler.phpt
@@ -0,0 +1,87 @@
1--TEST--
2Testing user session handler functions
3--SKIPIF--
4<?php include "../skipifnotcli.inc"; ?>
5--INI--
6suhosin.log.syslog=0
7suhosin.log.script=0
8suhosin.log.sapi=2
9suhosin.session.encrypt=On
10session.save_path=SUHOSIN_TEST_CASE
11--FILE--
12<?php
13
14$GLOBALS['test_array_session'] = array();
15$GLOBALS['msg'] = array();
16
17function sess_open($savePath, $sessionName)
18{
19 $GLOBALS['msg'][] = "open $savePath -> $sessionName";
20}
21function sess_close()
22{
23 $GLOBALS['msg'][] = "close";
24}
25function sess_read($id)
26{
27 $GLOBALS['msg'][] = "read $id";
28 return @$GLOBALS['test_array_session'][$id];
29}
30function sess_write($id, $data)
31{
32 $GLOBALS['msg'][] = "write $id - $data";
33 $GLOBALS['test_array_session'][$id] = $data;
34 return true;
35}
36function sess_destroy($id)
37{
38 $GLOBALS['msg'][] = "destroy $id";
39}
40function sess_gc($lifetime)
41{
42}
43
44session_set_save_handler ( "sess_open" , "sess_close" , "sess_read" , "sess_write" , "sess_destroy" , "sess_gc" );
45session_id(md5("testsession1"));
46session_start();
47
48$_SESSION['test1'] = "test";
49$_SESSION['test2'] = 12345;
50$_SESSION['test3'] = array();
51$_SESSION['test4'] = new StdClass();
52
53session_write_close();
54
55session_start();
56
57var_dump($_SESSION);
58var_dump($msg);
59
60?>
61--EXPECTF--
62array(4) {
63 ["test1"]=>
64 string(4) "test"
65 ["test2"]=>
66 int(12345)
67 ["test3"]=>
68 array(0) {
69 }
70 ["test4"]=>
71 object(stdClass)#1 (0) {
72 }
73}
74array(6) {
75 [0]=>
76 string(35) "open SUHOSIN_TEST_CASE -> PHPSESSID"
77 [1]=>
78 string(37) "read 4cdacd154c45b08c35d83f3b514eddab"
79 [2]=>
80 string(%d) "write 4cdacd154c45b08c35d83f3b514eddab - %s"
81 [3]=>
82 string(5) "close"
83 [4]=>
84 string(35) "open SUHOSIN_TEST_CASE -> PHPSESSID"
85 [5]=>
86 string(37) "read 4cdacd154c45b08c35d83f3b514eddab"
87}