Skip to content

Commit e930429

Browse files
author
Yasuo Ohgaki
committed
Fixed bug #61470 - session_regenerate_id() does not create session file.
Made session_regenerate_id() raise error for wrong usage.
1 parent 92576c7 commit e930429

File tree

6 files changed

+86
-30
lines changed

6 files changed

+86
-30
lines changed

ext/session/session.c

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2010,6 +2010,7 @@ static PHP_FUNCTION(session_id)
20102010
static PHP_FUNCTION(session_regenerate_id)
20112011
{
20122012
zend_bool del_ses = 0;
2013+
zend_string *data = NULL;
20132014

20142015
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &del_ses) == FAILURE) {
20152016
return;
@@ -2020,26 +2021,31 @@ static PHP_FUNCTION(session_regenerate_id)
20202021
RETURN_FALSE;
20212022
}
20222023

2023-
if (PS(session_status) == php_session_active) {
2024-
if (PS(id)) {
2025-
if (del_ses && PS(mod)->s_destroy(&PS(mod_data), PS(id)) == FAILURE) {
2026-
php_error_docref(NULL, E_WARNING, "Session object destruction failed");
2027-
RETURN_FALSE;
2028-
}
2029-
zend_string_release(PS(id));
2030-
PS(id) = NULL;
2031-
}
2024+
if (PS(session_status) != php_session_active) {
2025+
php_error_docref(NULL, E_WARNING, "Cannot regenerate session id - session is not active");
2026+
RETURN_FALSE;
2027+
}
20322028

2033-
PS(id) = PS(mod)->s_create_sid(&PS(mod_data));
2034-
if (PS(id)) {
2035-
PS(send_cookie) = 1;
2036-
php_session_reset_id();
2037-
RETURN_TRUE;
2038-
} else {
2039-
PS(id) = STR_EMPTY_ALLOC();
2029+
/* Keep current session data */
2030+
data = php_session_encode();
2031+
2032+
if (del_ses && PS(mod)->s_destroy(&PS(mod_data), PS(id)) == FAILURE) {
2033+
php_error_docref(NULL, E_WARNING, "Session object destruction failed");
2034+
}
2035+
php_rshutdown_session_globals();
2036+
php_rinit_session_globals();
2037+
2038+
php_session_initialize();
2039+
/* Restore session data */
2040+
if (data) {
2041+
if (PS(session_vars)) {
2042+
zend_string_release(PS(session_vars));
2043+
PS(session_vars) = NULL;
20402044
}
2045+
php_session_decode(data);
2046+
zend_string_release(data);
20412047
}
2042-
RETURN_FALSE;
2048+
RETURN_TRUE;
20432049
}
20442050
/* }}} */
20452051

ext/session/tests/bug61470.phpt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
Bug #61470 (session_regenerate_id() does not create session file)
33
--SKIPIF--
44
<?php include('skipif.inc'); ?>
5-
--XFAIL--
6-
Semantecs of create id seems changed. Will be fixed soon.
75
--INI--
86
--FILE--
97
<?php
@@ -24,6 +22,6 @@ var_dump(is_file($file2));
2422
unlink($file1);
2523
unlink($file2);
2624
--EXPECT--
27-
bool(true);
28-
bool(true);
25+
bool(true)
26+
bool(true)
2927

ext/session/tests/session_basic3.phpt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -180,15 +180,15 @@ ob_end_flush();
180180
*** Testing basic session functionality : variation3 use_trans_sid ***
181181
*** Test trans sid ***
182182

183-
<a href="/?PHPSESSID=testid&PHPSESSID=testid">test</a>
184-
<a href="/?PHPSESSID=testid&PHPSESSID=testid#bar">test</a>
185-
<a href="/?foo&PHPSESSID=testid&PHPSESSID=testid">test</a>
186-
<a href="/?foo&PHPSESSID=testid&PHPSESSID=testid#bar">test</a>
187-
<a href="/?foo=var&PHPSESSID=testid&PHPSESSID=testid">test</a>
188-
<a href="/?foo=var&PHPSESSID=testid&PHPSESSID=testid#bar">test</a>
189-
<a href="file.php?PHPSESSID=testid&PHPSESSID=testid">test</a>
190-
<a href="file.php?foo&PHPSESSID=testid&PHPSESSID=testid">test</a>
191-
<a href="file.php?foo=var&PHPSESSID=testid&PHPSESSID=testid">test</a>
183+
<a href="/?PHPSESSID=testid">test</a>
184+
<a href="/?PHPSESSID=testid#bar">test</a>
185+
<a href="/?foo&PHPSESSID=testid">test</a>
186+
<a href="/?foo&PHPSESSID=testid#bar">test</a>
187+
<a href="/?foo=var&PHPSESSID=testid">test</a>
188+
<a href="/?foo=var&PHPSESSID=testid#bar">test</a>
189+
<a href="file.php?PHPSESSID=testid">test</a>
190+
<a href="file.php?foo&PHPSESSID=testid">test</a>
191+
<a href="file.php?foo=var&PHPSESSID=testid">test</a>
192192
<a href="http://php.net">test</a>
193193
<a href="http://php.net/">test</a>
194194
<a href="http://php.net/#bar">test</a>

ext/session/tests/session_regenerate_id_basic.phpt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,16 @@ ob_end_flush();
3131
--EXPECTF--
3232
*** Testing session_regenerate_id() : basic functionality ***
3333
string(0) ""
34+
35+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
3436
bool(false)
3537
string(0) ""
3638
bool(true)
3739
bool(true)
3840
string(%d) "%s"
3941
bool(true)
42+
43+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
4044
bool(false)
4145
string(0) ""
4246
Done

ext/session/tests/session_regenerate_id_error.phpt

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,63 +96,103 @@ ob_end_flush();
9696
*** Testing session_regenerate_id() : error functionality ***
9797

9898
-- Iteration 1 --
99+
100+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
99101
bool(false)
100102

101103
-- Iteration 2 --
104+
105+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
102106
bool(false)
103107

104108
-- Iteration 3 --
109+
110+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
105111
bool(false)
106112

107113
-- Iteration 4 --
114+
115+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
108116
bool(false)
109117

110118
-- Iteration 5 --
119+
120+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
111121
bool(false)
112122

113123
-- Iteration 6 --
124+
125+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
114126
bool(false)
115127

116128
-- Iteration 7 --
129+
130+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
117131
bool(false)
118132

119133
-- Iteration 8 --
134+
135+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
120136
bool(false)
121137

122138
-- Iteration 9 --
139+
140+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
123141
bool(false)
124142

125143
-- Iteration 10 --
144+
145+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
126146
bool(false)
127147

128148
-- Iteration 11 --
149+
150+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
129151
bool(false)
130152

131153
-- Iteration 12 --
154+
155+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
132156
bool(false)
133157

134158
-- Iteration 13 --
159+
160+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
135161
bool(false)
136162

137163
-- Iteration 14 --
164+
165+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
138166
bool(false)
139167

140168
-- Iteration 15 --
169+
170+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
141171
bool(false)
142172

143173
-- Iteration 16 --
174+
175+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
144176
bool(false)
145177

146178
-- Iteration 17 --
179+
180+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
147181
bool(false)
148182

149183
-- Iteration 18 --
184+
185+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
150186
bool(false)
151187

152188
-- Iteration 19 --
189+
190+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
153191
bool(false)
154192

155193
-- Iteration 20 --
194+
195+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
156196
bool(false)
157197

158198
-- Iteration 21 --
@@ -161,9 +201,13 @@ Warning: session_regenerate_id() expects parameter 1 to be boolean, object given
161201
NULL
162202

163203
-- Iteration 22 --
204+
205+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
164206
bool(false)
165207

166208
-- Iteration 23 --
209+
210+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
167211
bool(false)
168212

169213
-- Iteration 24 --

ext/session/tests/session_regenerate_id_variation1.phpt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,16 @@ ob_end_flush();
3131
--EXPECTF--
3232
*** Testing session_regenerate_id() : variation ***
3333
string(0) ""
34+
35+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
3436
bool(false)
3537
string(0) ""
3638
bool(true)
3739
bool(true)
3840
string(%d) "%s"
3941
bool(true)
42+
43+
Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in %s on line %d
4044
bool(false)
4145
string(0) ""
4246
Done

0 commit comments

Comments
 (0)