MapCacheLRU: Properly handle bogus cache keys
authorChad Horohoe <chadh@wikimedia.org>
Tue, 6 Dec 2016 20:42:49 +0000 (12:42 -0800)
committerChad Horohoe <chadh@wikimedia.org>
Tue, 6 Dec 2016 20:42:49 +0000 (12:42 -0800)
They can only be strings or integers. Anything else is wrong. We
should be throwing exceptions here so developers find this early
when running tests and manual testing.

Exceptions (instead of warnings) allow us to get a full useful
stacktrace.

Change-Id: I823ce33523283509c14a05f816f261d6b400e243

includes/libs/MapCacheLRU.php

index 2f5a454..db6869b 100644 (file)
@@ -58,7 +58,7 @@ class MapCacheLRU {
         * @return void
         */
        public function set( $key, $value ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
+               if ( $this->has( $key ) ) {
                        $this->ping( $key );
                } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
                        reset( $this->cache );
@@ -75,6 +75,9 @@ class MapCacheLRU {
         * @return bool
         */
        public function has( $key ) {
+               if ( !is_int( $key ) && !is_string( $key ) ) {
+                       throw new MWException( __METHOD__ . ' called with invalid key. Must be string or integer.' );
+               }
                return array_key_exists( $key, $this->cache );
        }
 
@@ -87,7 +90,7 @@ class MapCacheLRU {
         * @return mixed Returns null if the key was not found
         */
        public function get( $key ) {
-               if ( !array_key_exists( $key, $this->cache ) ) {
+               if ( !$this->has( $key ) ) {
                        return null;
                }