Skip to content

Commit 2860ac4

Browse files
committed
validation for cookie lifetime
1 parent 29eb822 commit 2860ac4

5 files changed

Lines changed: 62 additions & 9 deletions

ext/session/session.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -706,11 +706,21 @@ static PHP_INI_MH(OnUpdateCookieLifetime)
706706
#else
707707
const zend_long maxcookie = ZEND_LONG_MAX / 2 - 1;
708708
#endif
709-
zend_long v = (zend_long)atol(ZSTR_VAL(new_value));
710-
if (v < 0) {
709+
zend_long lval = 0;
710+
int oflow = 0;
711+
uint8_t type = is_numeric_string_ex(ZSTR_VAL(new_value), ZSTR_LEN(new_value), &lval, NULL, false, &oflow, NULL);
712+
if (type == 0) {
713+
php_error_docref(NULL, E_WARNING, "Invalid value for CookieLifetime");
714+
return FAILURE;
715+
} else if (type == IS_DOUBLE && oflow == 0) {
716+
php_error_docref(NULL, E_WARNING, "CookieLifetime must be an integer");
717+
return FAILURE;
718+
}
719+
zend_long v = lval;
720+
if (oflow < 0 || v < 0) {
711721
php_error_docref(NULL, E_WARNING, "CookieLifetime cannot be negative");
712722
return FAILURE;
713-
} else if (v > maxcookie) {
723+
} else if (oflow > 0 || v > maxcookie) {
714724
php_error_docref(NULL, E_WARNING, "CookieLifetime value too large, value was set to the maximum of " ZEND_LONG_FMT, maxcookie);
715725
zend_long *p = ZEND_INI_GET_ADDR();
716726
*p = maxcookie;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
--TEST--
2+
session.cookie_lifetime rejects non-integer values
3+
--EXTENSIONS--
4+
session
5+
--SKIPIF--
6+
<?php include('skipif.inc'); ?>
7+
--FILE--
8+
<?php
9+
10+
ob_start();
11+
12+
ini_set("session.cookie_lifetime", 100);
13+
14+
// Float strings are rejected
15+
ini_set("session.cookie_lifetime", "1.5");
16+
var_dump(ini_get("session.cookie_lifetime")); // unchanged
17+
18+
// Non-numeric strings are rejected
19+
ini_set("session.cookie_lifetime", "abc");
20+
var_dump(ini_get("session.cookie_lifetime")); // unchanged
21+
22+
// Negative values are rejected
23+
ini_set("session.cookie_lifetime", -1);
24+
var_dump(ini_get("session.cookie_lifetime")); // unchanged
25+
26+
// Negative overflow strings are rejected
27+
ini_set("session.cookie_lifetime", "-99999999999999999999");
28+
var_dump(ini_get("session.cookie_lifetime")); // unchanged
29+
30+
ob_end_flush();
31+
?>
32+
--EXPECTF--
33+
Warning: ini_set(): CookieLifetime must be an integer in %s on line %d
34+
string(3) "100"
35+
36+
Warning: ini_set(): Invalid value for CookieLifetime in %s on line %d
37+
string(3) "100"
38+
39+
Warning: ini_set(): CookieLifetime cannot be negative in %s on line %d
40+
string(3) "100"
41+
42+
Warning: ini_set(): CookieLifetime cannot be negative in %s on line %d
43+
string(3) "100"

ext/session/tests/session_get_cookie_params_basic.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ echo "*** Testing session_get_cookie_params() : basic functionality ***\n";
2222
var_dump(session_get_cookie_params());
2323
var_dump(session_set_cookie_params(3600, "/path", "blah", FALSE, FALSE));
2424
var_dump(session_get_cookie_params());
25-
var_dump(session_set_cookie_params(1234567890, "/guff", "foo", TRUE, TRUE));
25+
var_dump(session_set_cookie_params(1000000000, "/guff", "foo", TRUE, TRUE));
2626
var_dump(session_get_cookie_params());
2727
var_dump(session_set_cookie_params([
2828
"lifetime" => 123,
@@ -40,7 +40,7 @@ var_dump(session_get_cookie_params());
4040
echo "Done";
4141
ob_end_flush();
4242
?>
43-
--EXPECTF--
43+
--EXPECT--
4444
*** Testing session_get_cookie_params() : basic functionality ***
4545
array(7) {
4646
["lifetime"]=>
@@ -78,7 +78,7 @@ array(7) {
7878
bool(true)
7979
array(7) {
8080
["lifetime"]=>
81-
int(%d)
81+
int(1000000000)
8282
["path"]=>
8383
string(5) "/guff"
8484
["domain"]=>

ext/session/tests/session_set_cookie_params_basic.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ var_dump(session_set_cookie_params(3600));
1515
var_dump(session_start());
1616
var_dump(session_set_cookie_params(1800));
1717
var_dump(session_destroy());
18-
var_dump(session_set_cookie_params(1234567890));
18+
var_dump(session_set_cookie_params(1000000000));
1919

2020
echo "Done";
2121
ob_end_flush();

ext/session/tests/session_set_cookie_params_variation1.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ var_dump(ini_get("session.cookie_lifetime"));
2424
var_dump(session_destroy());
2525

2626
var_dump(ini_get("session.cookie_lifetime"));
27-
var_dump(session_set_cookie_params(1234567890));
27+
var_dump(session_set_cookie_params(1000000000));
2828
var_dump(ini_get("session.cookie_lifetime"));
2929

3030
echo "Done";
@@ -44,5 +44,5 @@ string(4) "3600"
4444
bool(true)
4545
string(4) "3600"
4646
bool(true)
47-
string(10) "1234567890"
47+
string(10) "1000000000"
4848
Done

0 commit comments

Comments
 (0)