Skip to content

fix: remove incorrect Py_DECREF after PyList_SetItem#108

Open
Vitalymt wants to merge 1 commit intoyandex:mainfrom
Vitalymt:fix/use-after-free-cython-function
Open

fix: remove incorrect Py_DECREF after PyList_SetItem#108
Vitalymt wants to merge 1 commit intoyandex:mainfrom
Vitalymt:fix/use-after-free-cython-function

Conversation

@Vitalymt
Copy link
Copy Markdown

@Vitalymt Vitalymt commented May 7, 2026

Problem

PyList_SetItem() steals a reference to its third argument — even when the call fails. The current error path calls Py_DECREF(marker) after a failed PyList_SetItem(), which double-releases the reference since ownership was already transferred.

This is a use-after-free that can cause undefined behavior (crash, memory corruption) depending on allocator state and GC timing.

Fix

Removed the incorrect Py_DECREF(marker) in both the cython and cython_py2 copies of CythonFunction.c, and added a comment explaining the reference-stealing semantics for future maintainers.

The Py_DECREF(fromlist) is retained since fromlist still needs to be cleaned up.

Fixes #106

PyList_SetItem() steals a reference to its third argument regardless
of whether the call succeeds or fails. Calling Py_DECREF(marker) in
the error path causes a double-release since the reference was already
consumed by PyList_SetItem.

Removed the redundant Py_DECREF and added a comment explaining the
reference semantics for both the cython and cython_py2 copies.

Fixes yandex#106
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Reference Counting (Use-After-Free) Bug for PyList_SetItem

2 participants