Skip to content

Commit f8147d0

Browse files
authored
gh-116541: Handle errors correctly in _pystatvfs_fromstructstatvfs (#116542)
1 parent d308d33 commit f8147d0

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
@@ -12980,46 +12980,50 @@ _pystatvfs_fromstructstatvfs(PyObject *module, struct statvfs st) {
1298012980
if (v == NULL)
1298112981
return NULL;
1298212982

12983+
int pos = 0;
12984+
12985+
#define SET_RESULT(CALL) \
12986+
do { \
12987+
PyObject *item = (CALL); \
12988+
if (item == NULL) { \
12989+
Py_DECREF(v); \
12990+
return NULL; \
12991+
} \
12992+
PyStructSequence_SET_ITEM(v, pos++, item); \
12993+
} while(0)
12994+
1298312995
#if !defined(HAVE_LARGEFILE_SUPPORT)
12984-
PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
12985-
PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
12986-
PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long) st.f_blocks));
12987-
PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long) st.f_bfree));
12988-
PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long) st.f_bavail));
12989-
PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long) st.f_files));
12990-
PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong((long) st.f_ffree));
12991-
PyStructSequence_SET_ITEM(v, 7, PyLong_FromLong((long) st.f_favail));
12992-
PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
12993-
PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
12996+
SET_RESULT(PyLong_FromLong((long) st.f_bsize));
12997+
SET_RESULT(PyLong_FromLong((long) st.f_frsize));
12998+
SET_RESULT(PyLong_FromLong((long) st.f_blocks));
12999+
SET_RESULT(PyLong_FromLong((long) st.f_bfree));
13000+
SET_RESULT(PyLong_FromLong((long) st.f_bavail));
13001+
SET_RESULT(PyLong_FromLong((long) st.f_files));
13002+
SET_RESULT(PyLong_FromLong((long) st.f_ffree));
13003+
SET_RESULT(PyLong_FromLong((long) st.f_favail));
13004+
SET_RESULT(PyLong_FromLong((long) st.f_flag));
13005+
SET_RESULT(PyLong_FromLong((long) st.f_namemax));
1299413006
#else
12995-
PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
12996-
PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
12997-
PyStructSequence_SET_ITEM(v, 2,
12998-
PyLong_FromLongLong((long long) st.f_blocks));
12999-
PyStructSequence_SET_ITEM(v, 3,
13000-
PyLong_FromLongLong((long long) st.f_bfree));
13001-
PyStructSequence_SET_ITEM(v, 4,
13002-
PyLong_FromLongLong((long long) st.f_bavail));
13003-
PyStructSequence_SET_ITEM(v, 5,
13004-
PyLong_FromLongLong((long long) st.f_files));
13005-
PyStructSequence_SET_ITEM(v, 6,
13006-
PyLong_FromLongLong((long long) st.f_ffree));
13007-
PyStructSequence_SET_ITEM(v, 7,
13008-
PyLong_FromLongLong((long long) st.f_favail));
13009-
PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
13010-
PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
13007+
SET_RESULT(PyLong_FromLong((long) st.f_bsize));
13008+
SET_RESULT(PyLong_FromLong((long) st.f_frsize));
13009+
SET_RESULT(PyLong_FromLongLong((long long) st.f_blocks));
13010+
SET_RESULT(PyLong_FromLongLong((long long) st.f_bfree));
13011+
SET_RESULT(PyLong_FromLongLong((long long) st.f_bavail));
13012+
SET_RESULT(PyLong_FromLongLong((long long) st.f_files));
13013+
SET_RESULT(PyLong_FromLongLong((long long) st.f_ffree));
13014+
SET_RESULT(PyLong_FromLongLong((long long) st.f_favail));
13015+
SET_RESULT(PyLong_FromLong((long) st.f_flag));
13016+
SET_RESULT(PyLong_FromLong((long) st.f_namemax));
1301113017
#endif
1301213018
/* The _ALL_SOURCE feature test macro defines f_fsid as a structure
1301313019
* (issue #32390). */
1301413020
#if defined(_AIX) && defined(_ALL_SOURCE)
13015-
PyStructSequence_SET_ITEM(v, 10, PyLong_FromUnsignedLong(st.f_fsid.val[0]));
13021+
SET_RESULT(PyLong_FromUnsignedLong(st.f_fsid.val[0]));
1301613022
#else
13017-
PyStructSequence_SET_ITEM(v, 10, PyLong_FromUnsignedLong(st.f_fsid));
13023+
SET_RESULT(PyLong_FromUnsignedLong(st.f_fsid));
1301813024
#endif
13019-
if (PyErr_Occurred()) {
13020-
Py_DECREF(v);
13021-
return NULL;
13022-
}
13025+
13026+
#undef SET_RESULT
1302313027

1302413028
return v;
1302513029
}

0 commit comments

Comments
 (0)