summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Kestenholz <mk@feinheit.ch>2022-02-17 09:45:34 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-02-17 14:52:17 +0100
commitb2ed0d78f2dff9986ef15b9098c1b6d9ce720a99 (patch)
treeaa2afcb3c59b19d538ca6c281c83e6aeacf48f43
parenta94ae4cb11b2b6a6fffb26f5a2dfd0c665e2070d (diff)
Refs #28358 -- Fixed infinite recursion in LazyObject.__getattribute__().
Regression in 97d7990abde3fe4b525ae83958fd0b52d6a1d13f. Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com> Co-authored-by: Theo Alexiou <theofilosalexiou@gmail.com>
-rw-r--r--django/utils/functional.py3
-rw-r--r--tests/utils_tests/test_lazyobject.py8
2 files changed, 11 insertions, 0 deletions
diff --git a/django/utils/functional.py b/django/utils/functional.py
index 8dd8a8e006..5827389231 100644
--- a/django/utils/functional.py
+++ b/django/utils/functional.py
@@ -288,6 +288,9 @@ class LazyObject:
self._wrapped = empty
def __getattribute__(self, name):
+ if name == "_wrapped":
+ # Avoid recursion when getting wrapped object.
+ return super().__getattribute__(name)
value = super().__getattribute__(name)
# If attribute is a proxy method, raise an AttributeError to call
# __getattr__() and use the wrapped object method.
diff --git a/tests/utils_tests/test_lazyobject.py b/tests/utils_tests/test_lazyobject.py
index 161c9dbcec..134ae77750 100644
--- a/tests/utils_tests/test_lazyobject.py
+++ b/tests/utils_tests/test_lazyobject.py
@@ -58,6 +58,14 @@ class LazyObjectTestCase(TestCase):
obj = self.lazy_wrap(Foo())
self.assertEqual(obj.foo, "bar")
+ def test_getattr_falsey(self):
+ class Thing:
+ def __getattr__(self, key):
+ return []
+
+ obj = self.lazy_wrap(Thing())
+ self.assertEqual(obj.main, [])
+
def test_setattr(self):
obj = self.lazy_wrap(Foo())
obj.foo = "BAR"