From fac11549d103bc74aefbf851940c8ce3a398fa86 Mon Sep 17 00:00:00 2001 From: codingFeng101 <3524962421@qq.com> Date: Tue, 30 Jun 2026 23:27:23 +0800 Subject: [PATCH] Reject negative cache item sizes --- src/cachetools/__init__.py | 2 ++ tests/__init__.py | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/src/cachetools/__init__.py b/src/cachetools/__init__.py index 1b299c5..350122c 100644 --- a/src/cachetools/__init__.py +++ b/src/cachetools/__init__.py @@ -75,6 +75,8 @@ def __getitem__(self, key): def __setitem__(self, key, value): maxsize = self.__maxsize size = self.getsizeof(value) + if size < 0: + raise ValueError("value size must be non-negative") if size > maxsize: raise ValueError("value too large") if key not in self.__data or self.__size[key] < size: diff --git a/tests/__init__.py b/tests/__init__.py index 5856e71..a84f19e 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -284,6 +284,15 @@ def _test_getsizeof(self, cache): def test_getsizeof_param(self): self._test_getsizeof(self.Cache(maxsize=3, getsizeof=lambda x: x)) + def test_getsizeof_negative(self): + cache = self.Cache(maxsize=3, getsizeof=lambda x: -1) + + with self.assertRaises(ValueError): + cache[1] = 1 + + self.assertEqual(0, len(cache)) + self.assertEqual(0, cache.currsize) + def test_getsizeof_subclass(self): class Cache(self.Cache): @staticmethod