From 324db385e4aef9bf9a1a9283b4a08ffbbb307e46 Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Date: Fri, 8 Apr 2016 13:08:55 +0100
Subject: [PATCH] Bug 16229: Deep copy on first L2 fetch
When a value exists in L2 cache but not in L1 cache, it should be deep
copied if needed (i.e. not a scalar). Otherwise the calling code is able
to modify the value in cache.
Note that is theoretical, it's possible that no code does that.
Signed-off-by: Jacek Ablewicz <abl@biblos.pk.edu.pl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@unc.edu.ar>
---
Koha/Cache.pm | 2 ++
t/Cache.t | 8 +++++++-
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/Koha/Cache.pm b/Koha/Cache.pm
index 8370d3e..0c9558d 100644
--- a/Koha/Cache.pm
+++ b/Koha/Cache.pm
@@ -335,6 +335,8 @@ sub get_from_cache {
# Otherwise the L1 cache won't ever be populated
$L1_cache{$key} = $value;
+ $value = clone $value if ref $L1_cache{$key} and not $unsafe;
+
return $value;
}
diff --git a/t/Cache.t b/t/Cache.t
index 8adaf1c..fa20a45 100644
--- a/t/Cache.t
+++ b/t/Cache.t
@@ -17,7 +17,7 @@
use Modern::Perl;
-use Test::More tests => 37;
+use Test::More tests => 38;
my $destructorcount = 0;
@@ -181,6 +181,12 @@ SKIP: {
$item_from_cache = $cache->get_from_cache('test_deep_copy_array');
@$item_from_cache = qw( another array ref );
is_deeply( $cache->get_from_cache('test_deep_copy_array'), [ qw ( an array ref ) ], 'An array will be deep copied');
+
+ $cache->flush_L1_cache();
+ $item_from_cache = $cache->get_from_cache('test_deep_copy_array');
+ @$item_from_cache = qw( another array ref );
+ is_deeply( $cache->get_from_cache('test_deep_copy_array'), [ qw ( an array ref ) ], 'An array will be deep copied even it is the first fetch from L2');
+
$item_from_cache = $cache->get_from_cache('test_deep_copy_array', { unsafe => 1 });
@$item_from_cache = qw( another array ref );
is_deeply( $cache->get_from_cache('test_deep_copy_array'), [ qw ( another array ref ) ], 'An array will not be deep copied if the unsafe flag is set');
--
2.7.4