[3.12] gh-116448: Handle errors correctly in os_waitid_impl in posixmodule (GH-116449) (#116451)

gh-116448: Handle errors correctly in `os_waitid_impl` in `posixmodule` (GH-116449)
(cherry picked from commit 882fcede83)

Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
This commit is contained in:
Miss Islington (bot) 2024-03-07 10:03:28 +01:00 committed by GitHub
parent 1e75fe1468
commit cbd94fdb6c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -9400,15 +9400,25 @@ os_waitid_impl(PyObject *module, idtype_t idtype, id_t id, int options)
if (!result)
return NULL;
PyStructSequence_SET_ITEM(result, 0, PyLong_FromPid(si.si_pid));
PyStructSequence_SET_ITEM(result, 1, _PyLong_FromUid(si.si_uid));
PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si.si_signo)));
PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong((long)(si.si_status)));
PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong((long)(si.si_code)));
if (PyErr_Occurred()) {
Py_DECREF(result);
return NULL;
}
int pos = 0;
#define SET_RESULT(CALL) \
do { \
PyObject *item = (CALL); \
if (item == NULL) { \
Py_DECREF(result); \
return NULL; \
} \
PyStructSequence_SET_ITEM(result, pos++, item); \
} while(0)
SET_RESULT(PyLong_FromPid(si.si_pid));
SET_RESULT(_PyLong_FromUid(si.si_uid));
SET_RESULT(PyLong_FromLong((long)(si.si_signo)));
SET_RESULT(PyLong_FromLong((long)(si.si_status)));
SET_RESULT(PyLong_FromLong((long)(si.si_code)));
#undef SET_RESULT
return result;
}