mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
[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:
parent
1fb661579d
commit
d4e8cbbed4
1 changed files with 36 additions and 32 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue