Skip to content

Commit 52c4117

Browse files
[3.11] gh-116541: Handle errors correctly in _pystatvfs_fromstructstatvfs (GH-116542) (#116644)
gh-116541: Handle errors correctly in `_pystatvfs_fromstructstatvfs` (GH-116542) (cherry picked from commit f8147d0) Co-authored-by: Nikita Sobolev <[email protected]>
1 parent 5562a09 commit 52c4117

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
@@ -11463,46 +11463,50 @@ _pystatvfs_fromstructstatvfs(PyObject *module, struct statvfs st) {
1146311463
if (v == NULL)
1146411464
return NULL;
1146511465

11466+
int pos = 0;
11467+
11468+
#define SET_RESULT(CALL) \
11469+
do { \
11470+
PyObject *item = (CALL); \
11471+
if (item == NULL) { \
11472+
Py_DECREF(v); \
11473+
return NULL; \
11474+
} \
11475+
PyStructSequence_SET_ITEM(v, pos++, item); \
11476+
} while(0)
11477+
1146611478
#if !defined(HAVE_LARGEFILE_SUPPORT)
11467-
PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
11468-
PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
11469-
PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long) st.f_blocks));
11470-
PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long) st.f_bfree));
11471-
PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long) st.f_bavail));
11472-
PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long) st.f_files));
11473-
PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong((long) st.f_ffree));
11474-
PyStructSequence_SET_ITEM(v, 7, PyLong_FromLong((long) st.f_favail));
11475-
PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
11476-
PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
11479+
SET_RESULT(PyLong_FromLong((long) st.f_bsize));
11480+
SET_RESULT(PyLong_FromLong((long) st.f_frsize));
11481+
SET_RESULT(PyLong_FromLong((long) st.f_blocks));
11482+
SET_RESULT(PyLong_FromLong((long) st.f_bfree));
11483+
SET_RESULT(PyLong_FromLong((long) st.f_bavail));
11484+
SET_RESULT(PyLong_FromLong((long) st.f_files));
11485+
SET_RESULT(PyLong_FromLong((long) st.f_ffree));
11486+
SET_RESULT(PyLong_FromLong((long) st.f_favail));
11487+
SET_RESULT(PyLong_FromLong((long) st.f_flag));
11488+
SET_RESULT(PyLong_FromLong((long) st.f_namemax));
1147711489
#else
11478-
PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
11479-
PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
11480-
PyStructSequence_SET_ITEM(v, 2,
11481-
PyLong_FromLongLong((long long) st.f_blocks));
11482-
PyStructSequence_SET_ITEM(v, 3,
11483-
PyLong_FromLongLong((long long) st.f_bfree));
11484-
PyStructSequence_SET_ITEM(v, 4,
11485-
PyLong_FromLongLong((long long) st.f_bavail));
11486-
PyStructSequence_SET_ITEM(v, 5,
11487-
PyLong_FromLongLong((long long) st.f_files));
11488-
PyStructSequence_SET_ITEM(v, 6,
11489-
PyLong_FromLongLong((long long) st.f_ffree));
11490-
PyStructSequence_SET_ITEM(v, 7,
11491-
PyLong_FromLongLong((long long) st.f_favail));
11492-
PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
11493-
PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
11490+
SET_RESULT(PyLong_FromLong((long) st.f_bsize));
11491+
SET_RESULT(PyLong_FromLong((long) st.f_frsize));
11492+
SET_RESULT(PyLong_FromLongLong((long long) st.f_blocks));
11493+
SET_RESULT(PyLong_FromLongLong((long long) st.f_bfree));
11494+
SET_RESULT(PyLong_FromLongLong((long long) st.f_bavail));
11495+
SET_RESULT(PyLong_FromLongLong((long long) st.f_files));
11496+
SET_RESULT(PyLong_FromLongLong((long long) st.f_ffree));
11497+
SET_RESULT(PyLong_FromLongLong((long long) st.f_favail));
11498+
SET_RESULT(PyLong_FromLong((long) st.f_flag));
11499+
SET_RESULT(PyLong_FromLong((long) st.f_namemax));
1149411500
#endif
1149511501
/* The _ALL_SOURCE feature test macro defines f_fsid as a structure
1149611502
* (issue #32390). */
1149711503
#if defined(_AIX) && defined(_ALL_SOURCE)
11498-
PyStructSequence_SET_ITEM(v, 10, PyLong_FromUnsignedLong(st.f_fsid.val[0]));
11504+
SET_RESULT(PyLong_FromUnsignedLong(st.f_fsid.val[0]));
1149911505
#else
11500-
PyStructSequence_SET_ITEM(v, 10, PyLong_FromUnsignedLong(st.f_fsid));
11506+
SET_RESULT(PyLong_FromUnsignedLong(st.f_fsid));
1150111507
#endif
11502-
if (PyErr_Occurred()) {
11503-
Py_DECREF(v);
11504-
return NULL;
11505-
}
11508+
11509+
#undef SET_RESULT
1150611510

1150711511
return v;
1150811512
}

0 commit comments

Comments
 (0)