summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Simmers <swtaarrs@users.noreply.github.com>2024-03-01 01:02:12 (GMT)
committerGitHub <noreply@github.com>2024-03-01 01:02:12 (GMT)
commit2e94a6687c1a9750e9d2408a8dff0a422aeaf0e4 (patch)
treeaf6383add3321e0395156b5b37572b77b21b629a
parentd7ddd90308324340855ddb9cc8dda2c1ee3a5944 (diff)
downloadcpython-2e94a6687c1a9750e9d2408a8dff0a422aeaf0e4.zip
cpython-2e94a6687c1a9750e9d2408a8dff0a422aeaf0e4.tar.gz
cpython-2e94a6687c1a9750e9d2408a8dff0a422aeaf0e4.tar.bz2
gh-116099: Fix refcounting bug in `_queueobj_shared()` (gh-116164)
This code decrefs `qidobj` twice in some paths. Since `qidobj` isn't used after the first `Py_DECREF()`, remove the others, and replace the `Py_DECREF()` with `Py_CLEAR()` to make it clear that the variable is dead. With this fix, `python -mtest test_interpreters -R 3:3 -mtest_queues` no longer fails with `_Py_NegativeRefcount: Assertion failed: object has negative ref count`.
-rw-r--r--Modules/_xxinterpqueuesmodule.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/Modules/_xxinterpqueuesmodule.c b/Modules/_xxinterpqueuesmodule.c
index 715bb76..21ba817 100644
--- a/Modules/_xxinterpqueuesmodule.c
+++ b/Modules/_xxinterpqueuesmodule.c
@@ -1189,7 +1189,7 @@ _queueobj_shared(PyThreadState *tstate, PyObject *queueobj,
.label = "queue ID",
};
int res = idarg_int64_converter(qidobj, &converted);
- Py_DECREF(qidobj);
+ Py_CLEAR(qidobj);
if (!res) {
assert(PyErr_Occurred());
return -1;
@@ -1197,12 +1197,10 @@ _queueobj_shared(PyThreadState *tstate, PyObject *queueobj,
void *raw = _queueid_xid_new(converted.id);
if (raw == NULL) {
- Py_DECREF(qidobj);
return -1;
}
_PyCrossInterpreterData_Init(data, tstate->interp, raw, NULL,
_queueobj_from_xid);
- Py_DECREF(qidobj);
_PyCrossInterpreterData_SET_FREE(data, _queueid_xid_free);
return 0;
}