Aleksander Machniak
2015-05-12 fff8e0f2aebab70b180127441fb86807099319f6
Fix possible memcache/apc cache data consistency issues (#1490390)

And removed unused code
3 files modified
65 ■■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_cache.php 36 ●●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_cache_shared.php 28 ●●●●● patch | view | raw | blame | history
CHANGELOG
@@ -26,6 +26,7 @@
- Fix bug where preview_pane setting wasn't always saved into user preferences (#1490362)
- Fix bug where messages count was not updated after message move/delete with skip_deleted=false (#1490372)
- Fix security issue in contact photo handling (#1490379)
- Fix possible memcache/apc cache data consistency issues (#1490390)
RELEASE 1.1.1
-------------
program/lib/Roundcube/rcube_cache.php
@@ -265,7 +265,15 @@
        }
        if ($this->type != 'db') {
            if ($this->type == 'memcache') {
            $this->load_index();
            // Consistency check (#1490390)
            if (!in_array($key, $this->index)) {
                // we always check if the key exist in the index
                // to have data in consistent state. Keeping the index consistent
                // is needed for keys delete operation when we delete all keys or by prefix.
            }
            else if ($this->type == 'memcache') {
                $ckey = $this->ckey($key);
                $data = $this->db->get($ckey);
@@ -418,13 +426,7 @@
            }
            // Remove keys by name prefix
            else if ($prefix_mode) {
                // handle data inconsistency: it may happen that index
                // contains not all existing cache entries, here we could
                // handle at least these that were used before the index was read
                $index = array_merge($this->index, array_keys($this->cache));
                $index = array_unique($index);
                foreach ($index as $k) {
                foreach ($this->index as $k) {
                    if (strpos($k, $key) === 0) {
                        $this->delete_record($k);
                    }
@@ -460,13 +462,12 @@
    /**
     * Adds entry into memcache/apc DB.
     *
     * @param string  $key   Cache key name
     * @param mxied   $data  Serialized cache data
     * @param bollean $index Enables immediate index update
     * @param string $key  Cache key name
     * @param mixed  $data Serialized cache data
     *
     * @param boolean True on success, False on failure
     */
    private function add_record($key, $data, $index=false)
    private function add_record($key, $data)
    {
        if ($this->type == 'memcache') {
            $result = $this->db->replace($key, $data, MEMCACHE_COMPRESSED, $this->ttl);
@@ -484,17 +485,6 @@
            if ($this->debug) {
                $this->debug('store', $key, $data, $result);
            }
        }
        // Update index
        if ($index && $result) {
            $this->load_index();
            if (array_search($key, $this->index) === false) {
                $this->index[] = $key;
                $data = serialize($this->index);
                $this->add_record($this->ikey(), $data);
            }
        }
program/lib/Roundcube/rcube_cache_shared.php
@@ -260,7 +260,15 @@
        }
        if ($this->type != 'db') {
            if ($this->type == 'memcache') {
            $this->load_index();
            // Consistency check (#1490390)
            if (!in_array($key, $this->index)) {
                // we always check if the key exist in the index
                // to have data in consistent state. Keeping the index consistent
                // is needed for keys delete operation when we delete all keys or by prefix.
            }
            else if ($this->type == 'memcache') {
                $ckey = $this->ckey($key);
                $data = $this->db->get($ckey);
@@ -441,13 +449,12 @@
    /**
     * Adds entry into memcache/apc DB.
     *
     * @param string  $key   Cache key name
     * @param mxied   $data  Serialized cache data
     * @param bollean $index Enables immediate index update
     * @param string $key  Cache key name
     * @param mixed  $data Serialized cache data
     *
     * @param boolean True on success, False on failure
     */
    private function add_record($key, $data, $index=false)
    private function add_record($key, $data)
    {
        if ($this->type == 'memcache') {
            $result = $this->db->replace($key, $data, MEMCACHE_COMPRESSED, $this->ttl);
@@ -466,17 +473,6 @@
            if ($this->debug) {
                $this->debug('store', $key, $data, $result);
            }
        }
        // Update index
        if ($index && $result) {
            $this->load_index();
            if (array_search($key, $this->index) === false) {
                $this->index[] = $key;
                $data = serialize($this->index);
                $this->add_record($this->ikey(), $data);
            }
        }