Skip to content

Commit 281138c

Browse files
committed
Fix: avoid double-free if reference is queued multiple times.
1 parent eb609df commit 281138c

File tree

1 file changed

+12
-7
lines changed
  • graalpython/com.oracle.graal.python.cext/src

1 file changed

+12
-7
lines changed

graalpython/com.oracle.graal.python.cext/src/capi.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -402,18 +402,23 @@ Py_ssize_t PyTruffle_SUBREF(PyObject* obj, Py_ssize_t value) {
402402
Py_ssize_t PyTruffle_bulk_SUBREF(PyObject* ptrArray[], Py_ssize_t values[], int64_t len) {
403403
int64_t i;
404404
PyObject* obj;
405+
Py_ssize_t value;
405406

406407
for (i=0; i < len; i++) {
407408
obj = ptrArray[i];
408-
Py_ssize_t new_value = ((obj->ob_refcnt) -= values[i]);
409-
if (new_value == 0) {
410-
_Py_Dealloc(obj);
411-
}
409+
value = values[i];
410+
/* IMPORTANT: 'value == 0' indicates we should not process the reference at all */
411+
if (value > 0) {
412+
Py_ssize_t new_value = ((obj->ob_refcnt) -= value);
413+
if (new_value == 0) {
414+
_Py_Dealloc(obj);
415+
}
412416
#ifdef Py_REF_DEBUG
413-
else if (new_value < 0) {
414-
_Py_NegativeRefcount(filename, lineno, op);
415-
}
417+
else if (new_value < 0) {
418+
_Py_NegativeRefcount(filename, lineno, op);
419+
}
416420
#endif
421+
}
417422
}
418423
return 0;
419424
}

0 commit comments

Comments
 (0)