From 3192278eb21d228411d2d8ffddca9a8c5f5ce8a3 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Thu, 28 Mar 2019 19:38:13 -0700 Subject: [PATCH] objectcache: remove messy inheritence from APCBagOStuff in APCUBagOStuff Also make sure they always use PHP serialization to avoid CAS token problems and bugs in the custom pecl extension serializers. Change-Id: I43cef97ca4ac0f0cc21b65ba73d1887ed92e157f --- includes/libs/objectcache/APCBagOStuff.php | 59 ++++----------------- includes/libs/objectcache/APCUBagOStuff.php | 30 +++++++---- 2 files changed, 30 insertions(+), 59 deletions(-) diff --git a/includes/libs/objectcache/APCBagOStuff.php b/includes/libs/objectcache/APCBagOStuff.php index 902cd6a0f8..9a5a433c66 100644 --- a/includes/libs/objectcache/APCBagOStuff.php +++ b/includes/libs/objectcache/APCBagOStuff.php @@ -24,53 +24,22 @@ /** * This is a wrapper for APC's shared memory functions * + * Use PHP serialization to avoid bugs and easily create CAS tokens. + * APCu has a memory corruption bug when the serializer is set to 'default'. + * See T120267, and upstream bug reports: + * - https://github.com/krakjoe/apcu/issues/38 + * - https://github.com/krakjoe/apcu/issues/35 + * - https://github.com/krakjoe/apcu/issues/111 + * * @ingroup Cache */ class APCBagOStuff extends BagOStuff { - - /** - * @var bool If true, trust the APC implementation to serialize and - * deserialize objects correctly. If false, (de-)serialize in PHP. - */ - protected $nativeSerialize; - /** * @var string String to append to each APC key. This may be changed * whenever the handling of values is changed, to prevent existing code * from encountering older values which it cannot handle. */ - const KEY_SUFFIX = ':2'; - - /** - * Available parameters are: - * - nativeSerialize: If true, pass objects to apc_store(), and trust it - * to serialize them correctly. If false, serialize - * all values in PHP. - * - * @param array $params - */ - public function __construct( array $params = [] ) { - parent::__construct( $params ); - - if ( isset( $params['nativeSerialize'] ) ) { - $this->nativeSerialize = $params['nativeSerialize']; - } elseif ( extension_loaded( 'apcu' ) && ini_get( 'apc.serializer' ) === 'default' ) { - // APCu has a memory corruption bug when the serializer is set to 'default'. - // See T120267, and upstream bug reports: - // - https://github.com/krakjoe/apcu/issues/38 - // - https://github.com/krakjoe/apcu/issues/35 - // - https://github.com/krakjoe/apcu/issues/111 - $this->logger->warning( - 'The APCu extension is loaded and the apc.serializer INI setting ' . - 'is set to "default". This can cause memory corruption! ' . - 'You should change apc.serializer to "php" instead. ' . - 'See .' - ); - $this->nativeSerialize = false; - } else { - $this->nativeSerialize = true; - } - } + const KEY_SUFFIX = ':3'; protected function doGet( $key, $flags = 0, &$casToken = null ) { $casToken = null; @@ -117,18 +86,10 @@ class APCBagOStuff extends BagOStuff { } protected function serialize( $value ) { - if ( !$this->nativeSerialize && !$this->isInteger( $value ) ) { - $value = serialize( $value ); - } - return $value; + return $this->isInteger( $value ) ? (int)$value : serialize( $value ); } protected function unserialize( $value ) { - if ( is_string( $value ) && !$this->nativeSerialize ) { - $value = $this->isInteger( $value ) - ? intval( $value ) - : unserialize( $value ); - } - return $value; + return $this->isInteger( $value ) ? (int)$value : unserialize( $value ); } } diff --git a/includes/libs/objectcache/APCUBagOStuff.php b/includes/libs/objectcache/APCUBagOStuff.php index da6544b3d1..0483ee7ef2 100644 --- a/includes/libs/objectcache/APCUBagOStuff.php +++ b/includes/libs/objectcache/APCUBagOStuff.php @@ -24,20 +24,22 @@ /** * This is a wrapper for APCU's shared memory functions * + * Use PHP serialization to avoid bugs and easily create CAS tokens. + * APCu has a memory corruption bug when the serializer is set to 'default'. + * See T120267, and upstream bug reports: + * - https://github.com/krakjoe/apcu/issues/38 + * - https://github.com/krakjoe/apcu/issues/35 + * - https://github.com/krakjoe/apcu/issues/111 + * * @ingroup Cache */ -class APCUBagOStuff extends APCBagOStuff { +class APCUBagOStuff extends BagOStuff { /** - * Available parameters are: - * - nativeSerialize: If true, pass objects to apcu_store(), and trust it - * to serialize them correctly. If false, serialize - * all values in PHP. - * - * @param array $params + * @var string String to append to each APC key. This may be changed + * whenever the handling of values is changed, to prevent existing code + * from encountering older values which it cannot handle. */ - public function __construct( array $params = [] ) { - parent::__construct( $params ); - } + const KEY_SUFFIX = ':3'; protected function doGet( $key, $flags = 0, &$casToken = null ) { $casToken = null; @@ -100,4 +102,12 @@ class APCUBagOStuff extends APCBagOStuff { return false; } } + + protected function serialize( $value ) { + return $this->isInteger( $value ) ? (int)$value : serialize( $value ); + } + + protected function unserialize( $value ) { + return $this->isInteger( $value ) ? (int)$value : unserialize( $value ); + } } -- 2.20.1