Skip to content

Commit d4e8cbb

Browse files
[3.12] gh-116541: Handle errors correctly in _pystatvfs_fromstructstatvfs (GH-116542) (#116643)
gh-116541: Handle errors correctly in `_pystatvfs_fromstructstatvfs` (GH-116542) (cherry picked from commit f8147d0) Co-authored-by: Nikita Sobolev <[email protected]>
1 parent 1fb6615 commit d4e8cbb

File tree

1 file changed

+36
-32
lines changed

1 file changed

+36
-32
lines changed

Modules/posixmodule.c

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12371,46 +12371,50 @@ _pystatvfs_fromstructstatvfs(PyObject *module, struct statvfs st) {
1237112371
if (v == NULL)
1237212372
return NULL;
1237312373

12374+
int pos = 0;
12375+
12376+
#define SET_RESULT(CALL) \
12377+
do { \
12378+
PyObject *item = (CALL); \
12379+
if (item == NULL) { \
12380+
Py_DECREF(v); \
12381+
return NULL; \
12382+
} \
12383+
PyStructSequence_SET_ITEM(v, pos++, item); \
12384+
} while(0)
12385+
1237412386
#if !defined(HAVE_LARGEFILE_SUPPORT)
12375-
PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
12376-
PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
12377-
PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long) st.f_blocks));
12378-
PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long) st.f_bfree));
12379-
PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long) st.f_bavail));
12380-
PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long) st.f_files));
12381-
PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong((long) st.f_ffree));
12382-
PyStructSequence_SET_ITEM(v, 7, PyLong_FromLong((long) st.f_favail));
12383-
PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
12384-
PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
12387+
SET_RESULT(PyLong_FromLong((long) st.f_bsize));
12388+
SET_RESULT(PyLong_FromLong((long) st.f_frsize));
12389+
SET_RESULT(PyLong_FromLong((long) st.f_blocks));
12390+
SET_RESULT(PyLong_FromLong((long) st.f_bfree));
12391+
SET_RESULT(PyLong_FromLong((long) st.f_bavail));
12392+
SET_RESULT(PyLong_FromLong((long) st.f_files));
12393+
SET_RESULT(PyLong_FromLong((long) st.f_ffree));
12394+
SET_RESULT(PyLong_FromLong((long) st.f_favail));
12395+
SET_RESULT(PyLong_FromLong((long) st.f_flag));
12396+
SET_RESULT(PyLong_FromLong((long) st.f_namemax));
1238512397
#else
12386-
PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
12387-
PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
12388-
PyStructSequence_SET_ITEM(v, 2,
12389-
PyLong_FromLongLong((long long) st.f_blocks));
12390-
PyStructSequence_SET_ITEM(v, 3,
12391-
PyLong_FromLongLong((long long) st.f_bfree));
12392-
PyStructSequence_SET_ITEM(v, 4,
12393-
PyLong_FromLongLong((long long) st.f_bavail));
12394-
PyStructSequence_SET_ITEM(v, 5,
12395-
PyLong_FromLongLong((long long) st.f_files));
12396-
PyStructSequence_SET_ITEM(v, 6,
12397-
PyLong_FromLongLong((long long) st.f_ffree));
12398-
PyStructSequence_SET_ITEM(v, 7,
12399-
PyLong_FromLongLong((long long) st.f_favail));
12400-
PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
12401-
PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
12398+
SET_RESULT(PyLong_FromLong((long) st.f_bsize));
12399+
SET_RESULT(PyLong_FromLong((long) st.f_frsize));
12400+
SET_RESULT(PyLong_FromLongLong((long long) st.f_blocks));
12401+
SET_RESULT(PyLong_FromLongLong((long long) st.f_bfree));
12402+
SET_RESULT(PyLong_FromLongLong((long long) st.f_bavail));
12403+
SET_RESULT(PyLong_FromLongLong((long long) st.f_files));
12404+
SET_RESULT(PyLong_FromLongLong((long long) st.f_ffree));
12405+
SET_RESULT(PyLong_FromLongLong((long long) st.f_favail));
12406+
SET_RESULT(PyLong_FromLong((long) st.f_flag));
12407+
SET_RESULT(PyLong_FromLong((long) st.f_namemax));
1240212408
#endif
1240312409
/* The _ALL_SOURCE feature test macro defines f_fsid as a structure
1240412410
* (issue #32390). */
1240512411
#if defined(_AIX) && defined(_ALL_SOURCE)
12406-
PyStructSequence_SET_ITEM(v, 10, PyLong_FromUnsignedLong(st.f_fsid.val[0]));
12412+
SET_RESULT(PyLong_FromUnsignedLong(st.f_fsid.val[0]));
1240712413
#else
12408-
PyStructSequence_SET_ITEM(v, 10, PyLong_FromUnsignedLong(st.f_fsid));
12414+
SET_RESULT(PyLong_FromUnsignedLong(st.f_fsid));
1240912415
#endif
12410-
if (PyErr_Occurred()) {
12411-
Py_DECREF(v);
12412-
return NULL;
12413-
}
12416+
12417+
#undef SET_RESULT
1241412418

1241512419
return v;
1241612420
}

0 commit comments

Comments
 (0)