Fix cookie expiry time calculation on 32bit systems.

strtotime() misbehaves on 32bit systems when the resulting timestamp
would overflow an integer. Use a DateTime to workaround this issue.

Fixes #3868
This commit is contained in:
mark_story 2013-06-03 20:16:18 -04:00
parent 027cfe9496
commit 3aa189eb3a
2 changed files with 29 additions and 4 deletions

View file

@ -387,20 +387,20 @@ class CookieComponent extends Component {
* @return integer Unix timestamp * @return integer Unix timestamp
*/ */
protected function _expire($expires = null) { protected function _expire($expires = null) {
$now = time();
if (is_null($expires)) { if (is_null($expires)) {
return $this->_expires; return $this->_expires;
} }
$this->_reset = $this->_expires; $this->_reset = $this->_expires;
if (!$expires) { if (!$expires) {
return $this->_expires = 0; return $this->_expires = 0;
} }
$now = new DateTime();
if (is_int($expires) || is_numeric($expires)) { if (is_int($expires) || is_numeric($expires)) {
return $this->_expires = $now + intval($expires); return $this->_expires = $now->format('U') + intval($expires);
} }
return $this->_expires = strtotime($expires, $now); $now->modify($expires);
return $this->_expires = $now->format('U');
} }
/** /**

View file

@ -201,6 +201,31 @@ class CookieComponentTest extends CakeTestCase {
$this->assertEquals('value', $result); $this->assertEquals('value', $result);
} }
/**
* test write with distant future cookies
*
* @return void
*/
public function testWriteFarFuture() {
$this->Cookie->write('Testing', 'value', false, '+90 years');
$future = new DateTime('now');
$future->modify('+90 years');
$expected = array(
'name' => $this->Cookie->name . '[Testing]',
'value' => 'value',
'path' => '/',
'domain' => '',
'secure' => false,
'httpOnly' => false);
$result = $this->Controller->response->cookie($this->Cookie->name . '[Testing]');
$this->assertEquals($future->format('U'), $result['expire'], '', 3);
unset($result['expire']);
$this->assertEquals($expected, $result);
}
/** /**
* test write with httpOnly cookies * test write with httpOnly cookies
* *