8000 Merge branch '2.7' into 2.8 · symfony/symfony@25fa4a0 · GitHub
[go: up one dir, main page]

Skip to content

Commit 25fa4a0

Browse files
Merge branch '2.7' into 2.8
* 2.7: [Config] ConfigCache::isFresh() should return false on __PHP_Incomplete_Class
2 parents d3014e4 + c360a22 commit 25fa4a0

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

src/Symfony/Component/Config/ResourceCheckerConfigCache.php

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,37 @@ public function isFresh()
7777
return true;
7878
}
7979

80+
$metadata = $this->getMetaFile();
81+
if (!is_file($metadata)) {
82+
return false;
83+
}
84+
85+
$e = null;
86+
$meta = false;
8087
$time = filemtime($this->file);
81-
$meta = unserialize(file_get_contents($metadata));
88+
$signalingException = new \UnexpectedValueException();
89+
$prevUnserializeHandler = ini_set('unserialize_callback_func', '');
90+
$prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context) use (&$prevErrorHandler, $signalingException) {
91+
if (E_WARNING === $type && 'Class __PHP_Incomplete_Class has no unserializer' === $msg) {
92+
throw $signalingException;
93+
}
94+
95+
return $prevErrorHandler ? $prevErrorHandler($type, $msg, $file, $line, $context) : false;
96+
});
97+
98+
try {
99+
$meta = unserialize(file_get_contents($metadata));
100+
} catch (\Error $e) {
101+
} catch (\Exception $e) {
102+
}
103+
restore_error_handler();
104+
ini_set('unserialize_callback_func', $prevUnserializeHandler);
105+
if (null !== $e && $e !== $signalingException) {
106+
throw $e;
107+
}
108+
if (false === $meta) {
109+
return false;
110+
}
82111

83112
foreach ($meta as $resource) {
84113
/* @var ResourceInterface $resource */

src/Symfony/Component/Config/Tests/ResourceCheckerConfigCacheTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Config\Tests;
1313

1414
use Symfony\Component\Config\Tests\Resource\ResourceStub;
15+
use Symfony\Component\Config\Resource\FileResource;
1516
use Symfony\Component\Config\ResourceCheckerConfigCache;
1617

1718
class ResourceCheckerConfigCacheTest extends \PHPUnit_Framework_TestCase
@@ -108,6 +109,18 @@ public function testIsNotFreshWithchecker()
108109
$this->assertFalse($cache->isFresh());
109110
}
110111

112+
public function testCacheIsNotFreshWhenUnserializeFails()
113+
{
114+
$checker = $this->getMock('\Symfony\Component\Config\ResourceCheckerInterface');
115+
$cache = new ResourceCheckerConfigCache($this->cacheFile, array($checker));
116+
$cache->write('foo', array(new FileResource(__FILE__)));
117+
118+
$metaFile = "{$this->cacheFile}.meta";
119+
file_put_contents($metaFile, str_replace('FileResource', 'ClassNotHere', file_get_contents($metaFile)));
120+
121+
$this->assertFalse($cache->isFresh());
122+
}
123+
111124
public function testCacheKeepsContent()
112125
{
113126
$cache = new ResourceCheckerConfigCache($this->cacheFile);

0 commit comments

Comments
 (0)
0