# HG changeset patch # User Marcin Kuzminski # Date 2018-07-23 13:26:36 # Node ID dfc57a111ef532008735895ba87a7e9f992ca381 # Parent 76c75f2d3bba2053fbe0ad4fa49fcfdfb2820b49 caches: use safest possible pickle for cache backends. - If this crashes we end up in fatal non-recoverable state. diff --git a/rhodecode/lib/rc_cache/backends.py b/rhodecode/lib/rc_cache/backends.py --- a/rhodecode/lib/rc_cache/backends.py +++ b/rhodecode/lib/rc_cache/backends.py @@ -62,11 +62,23 @@ class LRUMemoryBackend(memory_backend.Me 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, red 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,