[3.13] gh-121652: Handle `allocate_weakref` returning NULL (GH-121653) (#121721)

The `allocate_weakref` may return NULL when out of memory. We need to
handle that case and propagate the error.
(cherry picked from commit a640a605a8)

Co-authored-by: Sam Gross <colesbury@gmail.com>
This commit is contained in:
Miss Islington (bot) 2024-07-13 18:31:50 +02:00 committed by GitHub
parent f0c29a2d9f
commit f78e1aa1f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 7 additions and 0 deletions

View File

@ -426,6 +426,10 @@ get_or_create_weakref(PyTypeObject *type, PyObject *obj, PyObject *callback)
return basic_ref; return basic_ref;
} }
PyWeakReference *newref = allocate_weakref(type, obj, callback); PyWeakReference *newref = allocate_weakref(type, obj, callback);
if (newref == NULL) {
UNLOCK_WEAKREFS(obj);
return NULL;
}
insert_weakref(newref, list); insert_weakref(newref, list);
UNLOCK_WEAKREFS(obj); UNLOCK_WEAKREFS(obj);
return newref; return newref;
@ -433,6 +437,9 @@ get_or_create_weakref(PyTypeObject *type, PyObject *obj, PyObject *callback)
else { else {
// We may not be able to safely allocate inside the lock // We may not be able to safely allocate inside the lock
PyWeakReference *newref = allocate_weakref(type, obj, callback); PyWeakReference *newref = allocate_weakref(type, obj, callback);
if (newref == NULL) {
return NULL;
}
LOCK_WEAKREFS(obj); LOCK_WEAKREFS(obj);
insert_weakref(newref, list); insert_weakref(newref, list);
UNLOCK_WEAKREFS(obj); UNLOCK_WEAKREFS(obj);