[Cache] Prevent notice on case matching metadata trick
On saving an array of one element with a int key of strlen 10 it matches the first conditions of the trick used to save metadata. > Notice: Trying to access array offset on value of type int Casting it to string fixes it.
This commit is contained in:
parent
2dd4561d3f
commit
a91ac74906
@ -51,7 +51,7 @@ abstract class AbstractAdapter implements AdapterInterface, CacheInterface, Logg
|
|||||||
// Detect wrapped values that encode for their expiry and creation duration
|
// Detect wrapped values that encode for their expiry and creation duration
|
||||||
// For compactness, these values are packed in the key of an array using
|
// For compactness, these values are packed in the key of an array using
|
||||||
// magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F
|
// magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F
|
||||||
if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = key($v)) && "\x9D" === $k[0] && "\0" === $k[5] && "\x5F" === $k[9]) {
|
if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = (string) key($v)) && "\x9D" === $k[0] && "\0" === $k[5] && "\x5F" === $k[9]) {
|
||||||
$item->value = $v[$k];
|
$item->value = $v[$k];
|
||||||
$v = unpack('Ve/Nc', substr($k, 1, -1));
|
$v = unpack('Ve/Nc', substr($k, 1, -1));
|
||||||
$item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET;
|
$item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET;
|
||||||
|
@ -59,7 +59,7 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa
|
|||||||
// Detect wrapped values that encode for their expiry and creation duration
|
// Detect wrapped values that encode for their expiry and creation duration
|
||||||
// For compactness, these values are packed in the key of an array using
|
// For compactness, these values are packed in the key of an array using
|
||||||
// magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F
|
// magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F
|
||||||
if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = key($v)) && "\x9D" === $k[0] && "\0" === $k[5] && "\x5F" === $k[9]) {
|
if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = (string) key($v)) && "\x9D" === $k[0] && "\0" === $k[5] && "\x5F" === $k[9]) {
|
||||||
$item->value = $v[$k];
|
$item->value = $v[$k];
|
||||||
$v = unpack('Ve/Nc', substr($k, 1, -1));
|
$v = unpack('Ve/Nc', substr($k, 1, -1));
|
||||||
$item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET;
|
$item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET;
|
||||||
|
@ -272,6 +272,30 @@ abstract class AdapterTestCase extends CachePoolTest
|
|||||||
$this->assertFalse($cache->hasItem('foobar'));
|
$this->assertFalse($cache->hasItem('foobar'));
|
||||||
$this->assertTrue($cache->hasItem('barfoo'));
|
$this->assertTrue($cache->hasItem('barfoo'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testWeirdDataMatchingMetadataWrappedValues()
|
||||||
|
{
|
||||||
|
if (isset($this->skippedTests[__FUNCTION__])) {
|
||||||
|
$this->markTestSkipped($this->skippedTests[__FUNCTION__]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$cache = $this->createCachePool(0, __FUNCTION__);
|
||||||
|
$cache->clear();
|
||||||
|
|
||||||
|
$item = $cache->getItem('foobar');
|
||||||
|
|
||||||
|
// it should be an array containing only one element
|
||||||
|
// with key having a strlen of 10.
|
||||||
|
$weirdDataMatchingMedatataWrappedValue = [
|
||||||
|
1234567890 => [
|
||||||
|
1,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
$cache->save($item->set($weirdDataMatchingMedatataWrappedValue));
|
||||||
|
|
||||||
|
$this->assertTrue($cache->hasItem('foobar'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class NotUnserializable
|
class NotUnserializable
|
||||||
|
Reference in New Issue
Block a user