[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 f8147d01da)

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

View file

@ -12371,46 +12371,50 @@ _pystatvfs_fromstructstatvfs(PyObject *module, struct statvfs st) {
if (v == NULL) if (v == NULL)
return NULL; return NULL;
int pos = 0;
#define SET_RESULT(CALL) \
do { \
PyObject *item = (CALL); \
if (item == NULL) { \
Py_DECREF(v); \
return NULL; \
} \
PyStructSequence_SET_ITEM(v, pos++, item); \
} while(0)
#if !defined(HAVE_LARGEFILE_SUPPORT) #if !defined(HAVE_LARGEFILE_SUPPORT)
PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize)); SET_RESULT(PyLong_FromLong((long) st.f_bsize));
PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize)); SET_RESULT(PyLong_FromLong((long) st.f_frsize));
PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long) st.f_blocks)); SET_RESULT(PyLong_FromLong((long) st.f_blocks));
PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long) st.f_bfree)); SET_RESULT(PyLong_FromLong((long) st.f_bfree));
PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long) st.f_bavail)); SET_RESULT(PyLong_FromLong((long) st.f_bavail));
PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long) st.f_files)); SET_RESULT(PyLong_FromLong((long) st.f_files));
PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong((long) st.f_ffree)); SET_RESULT(PyLong_FromLong((long) st.f_ffree));
PyStructSequence_SET_ITEM(v, 7, PyLong_FromLong((long) st.f_favail)); SET_RESULT(PyLong_FromLong((long) st.f_favail));
PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag)); SET_RESULT(PyLong_FromLong((long) st.f_flag));
PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax)); SET_RESULT(PyLong_FromLong((long) st.f_namemax));
#else #else
PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize)); SET_RESULT(PyLong_FromLong((long) st.f_bsize));
PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize)); SET_RESULT(PyLong_FromLong((long) st.f_frsize));
PyStructSequence_SET_ITEM(v, 2, SET_RESULT(PyLong_FromLongLong((long long) st.f_blocks));
PyLong_FromLongLong((long long) st.f_blocks)); SET_RESULT(PyLong_FromLongLong((long long) st.f_bfree));
PyStructSequence_SET_ITEM(v, 3, SET_RESULT(PyLong_FromLongLong((long long) st.f_bavail));
PyLong_FromLongLong((long long) st.f_bfree)); SET_RESULT(PyLong_FromLongLong((long long) st.f_files));
PyStructSequence_SET_ITEM(v, 4, SET_RESULT(PyLong_FromLongLong((long long) st.f_ffree));
PyLong_FromLongLong((long long) st.f_bavail)); SET_RESULT(PyLong_FromLongLong((long long) st.f_favail));
PyStructSequence_SET_ITEM(v, 5, SET_RESULT(PyLong_FromLong((long) st.f_flag));
PyLong_FromLongLong((long long) st.f_files)); SET_RESULT(PyLong_FromLong((long) st.f_namemax));
PyStructSequence_SET_ITEM(v, 6,
PyLong_FromLongLong((long long) st.f_ffree));
PyStructSequence_SET_ITEM(v, 7,
PyLong_FromLongLong((long long) st.f_favail));
PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
#endif #endif
/* The _ALL_SOURCE feature test macro defines f_fsid as a structure /* The _ALL_SOURCE feature test macro defines f_fsid as a structure
* (issue #32390). */ * (issue #32390). */
#if defined(_AIX) && defined(_ALL_SOURCE) #if defined(_AIX) && defined(_ALL_SOURCE)
PyStructSequence_SET_ITEM(v, 10, PyLong_FromUnsignedLong(st.f_fsid.val[0])); SET_RESULT(PyLong_FromUnsignedLong(st.f_fsid.val[0]));
#else #else
PyStructSequence_SET_ITEM(v, 10, PyLong_FromUnsignedLong(st.f_fsid)); SET_RESULT(PyLong_FromUnsignedLong(st.f_fsid));
#endif #endif
if (PyErr_Occurred()) {
Py_DECREF(v); #undef SET_RESULT
return NULL;
}
return v; return v;
} }