diff options
author | Brett Simmers <swtaarrs@users.noreply.github.com> | 2024-03-01 01:02:12 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-01 01:02:12 (GMT) |
commit | 2e94a6687c1a9750e9d2408a8dff0a422aeaf0e4 (patch) | |
tree | af6383add3321e0395156b5b37572b77b21b629a | |
parent | d7ddd90308324340855ddb9cc8dda2c1ee3a5944 (diff) | |
download | cpython-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.c | 4 |
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; } |