gh-116448: Handle errors correctly in `os_waitid_impl` in `posixmodule` (#116449)

This commit is contained in:
Nikita Sobolev 2024-03-07 11:28:48 +03:00 committed by GitHub
parent 808a77612f
commit 882fcede83
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 19 additions and 9 deletions

View File

@ -9732,15 +9732,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;
}