From: Okiemute Enato <51956662+okiemute04@users.noreply.github.com> Date: Thu, 19 Mar 2026 10:50:18 +0000 (-0700) Subject: gh-146091: Fix NULL check in termios.tcsetwinsize (#146147) X-Git-Tag: v3.15.0a8~252 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=89a154a0c0f6b8844e1fe7fd761f75ead13608bd;p=thirdparty%2FPython%2Fcpython.git gh-146091: Fix NULL check in termios.tcsetwinsize (#146147) --- diff --git a/Misc/NEWS.d/next/Library/2026-03-18-16-58-17.gh-issue-146091.lBbo1L.rst b/Misc/NEWS.d/next/Library/2026-03-18-16-58-17.gh-issue-146091.lBbo1L.rst new file mode 100644 index 000000000000..2ed3ea8f90e9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-03-18-16-58-17.gh-issue-146091.lBbo1L.rst @@ -0,0 +1,3 @@ +Fix a bug in :func:`termios.tcsetwinsize` where passing a sequence that +raises an exception in ``__getitem__`` would cause a :exc:`SystemError` +instead of propagating the original exception. diff --git a/Modules/termios.c b/Modules/termios.c index b4eb06cf8ae8..95b9c920f39c 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -500,19 +500,24 @@ termios_tcsetwinsize_impl(PyObject *module, int fd, PyObject *winsz) PyObject *tmp_item; long winsz_0, winsz_1; tmp_item = PySequence_GetItem(winsz, 0); + if (tmp_item == NULL) { + return NULL; + } winsz_0 = PyLong_AsLong(tmp_item); + Py_DECREF(tmp_item); if (winsz_0 == -1 && PyErr_Occurred()) { - Py_XDECREF(tmp_item); return NULL; } - Py_XDECREF(tmp_item); tmp_item = PySequence_GetItem(winsz, 1); + if (tmp_item == NULL) { + return NULL; + } winsz_1 = PyLong_AsLong(tmp_item); + Py_DECREF(tmp_item); if (winsz_1 == -1 && PyErr_Occurred()) { - Py_XDECREF(tmp_item); return NULL; } - Py_XDECREF(tmp_item); + termiosmodulestate *state = PyModule_GetState(module);