From e9e73ec871f4fccc3b53e8927ad8f4ee25faeef6 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 23 Jul 2018 15:26:36 +0200 Subject: [PATCH] caches: use safest possible pickle for cache backends. - If this crashes we end up in fatal non-recoverable state. --- rhodecode/lib/rc_cache/backends.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/rhodecode/lib/rc_cache/backends.py b/rhodecode/lib/rc_cache/backends.py index 623efd20..fae11fc4 100644 --- a/rhodecode/lib/rc_cache/backends.py +++ b/rhodecode/lib/rc_cache/backends.py @@ -62,11 +62,23 @@ class LRUMemoryBackend(memory_backend.MemoryBackend): class Serializer(object): - def _dumps(self, value): - return compat.pickle.dumps(value) + def _dumps(self, value, safe=False): + try: + return compat.pickle.dumps(value) + except Exception: + if safe: + return NO_VALUE + else: + raise - def _loads(self, value): - return compat.pickle.loads(value) + def _loads(self, value, safe=True): + try: + return compat.pickle.loads(value) + except Exception: + if safe: + return NO_VALUE + else: + raise class CustomLockFactory(FileLock): @@ -159,6 +171,12 @@ class RedisPickleBackend(Serializer, redis_backend.RedisBackend): def get_store(self): return self.client.connection_pool + def get(self, key): + value = self.client.get(key) + if value is None: + return NO_VALUE + return self._loads(value) + def set(self, key, value): if self.redis_expiration_time: self.client.setex(key, self.redis_expiration_time,