Skip to content

Commit

Permalink
[3.11] gh-99184: Bypass instance attribute access in repr of `weakr…
Browse files Browse the repository at this point in the history
…ef.ref` (GH-99244) (#103789)

gh-99184: Bypass instance attribute access in `repr` of `weakref.ref` (GH-99244)
(cherry picked from commit 58b6be3)

Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
  • Loading branch information
miss-islington and sobolevn authored Apr 24, 2023
1 parent a8489f7 commit c8de883
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 4 deletions.
11 changes: 11 additions & 0 deletions Lib/test/test_weakref.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,17 @@ def test_basic_ref(self):
del o
repr(wr)

def test_repr_failure_gh99184(self):
class MyConfig(dict):
def __getattr__(self, x):
return self[x]

obj = MyConfig(offset=5)
obj_weakref = weakref.ref(obj)

self.assertIn('MyConfig', repr(obj_weakref))
self.assertIn('MyConfig', str(obj_weakref))

def test_basic_callback(self):
self.check_basic_callback(C)
self.check_basic_callback(create_function)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Bypass instance attribute access of ``__name__`` in ``repr`` of
:class:`weakref.ref`.
5 changes: 1 addition & 4 deletions Objects/weakrefobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,10 +170,7 @@ weakref_repr(PyWeakReference *self)
}

Py_INCREF(obj);
if (_PyObject_LookupAttr(obj, &_Py_ID(__name__), &name) < 0) {
Py_DECREF(obj);
return NULL;
}
name = _PyObject_LookupSpecial(obj, &_Py_ID(__name__));
if (name == NULL || !PyUnicode_Check(name)) {
repr = PyUnicode_FromFormat(
"<weakref at %p; to '%s' at %p>",
Expand Down

0 comments on commit c8de883

Please sign in to comment.