[BUGFIX][Cache][PDO] Duplicate cache entry possible 03/18103/2
authorLeon Dietsch <leon.dietsch@googlemail.com>
Tue, 27 Nov 2012 01:12:52 +0000 (02:12 +0100)
committerChristian Kuhn <lolli@schwarzbu.ch>
Thu, 7 Feb 2013 21:49:33 +0000 (22:49 +0100)
An identifier must be unique in the database. If some entry is set(),
the PdoBackend removes any entry with a given identifier if the cache
entry exists already. The remove() call is encapsulated with has(),
but has() returns FALSE if a cache entry is expired, so entries with
expired lifetime are not removed properly.
This leads to a \PDOException because of duplicate identifier.

The patch removes the check to has(), so set() will also remove
expired cache entries with this identifier before creating a new one.

Change-Id: Ife4e35223394805fc6d9e0b820a5d42789133f7b
Fixes: #34129
Releases: 6.1, 6.0, 4.7, 4.6, 4.5
Reviewed-on: https://review.typo3.org/18103
Reviewed-by: Christian Kuhn
Tested-by: Christian Kuhn
t3lib/cache/backend/class.t3lib_cache_backend_pdobackend.php

index b6c32be..2511b1a 100644 (file)
@@ -155,9 +155,7 @@ class t3lib_cache_backend_PdoBackend extends t3lib_cache_backend_AbstractBackend
                        );
                }
 
-               if ($this->has($entryIdentifier)) {
-                       $this->remove($entryIdentifier);
-               }
+               $this->remove($entryIdentifier);
 
                $lifetime = ($lifetime === NULL) ? $this->defaultLifetime : $lifetime;