Skip to content

Commit 54bde5d

Browse files
authored
gh-87804: Fix error handling and style in _pystatvfs_fromstructstatfs (#115236)
1 parent e1552fd commit 54bde5d

File tree

1 file changed

+33
-31
lines changed

1 file changed

+33
-31
lines changed

Modules/posixmodule.c

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12894,49 +12894,51 @@ os_WSTOPSIG_impl(PyObject *module, int status)
1289412894

1289512895
#ifdef __APPLE__
1289612896
/* On macOS struct statvfs uses 32-bit integers for block counts,
12897-
* resulting in overflow when filesystems are larger tan 4TB. Therefore
12897+
* resulting in overflow when filesystems are larger than 4TB. Therefore
1289812898
* os.statvfs is implemented in terms of statfs(2).
1289912899
*/
1290012900

1290112901
static PyObject*
1290212902
_pystatvfs_fromstructstatfs(PyObject *module, struct statfs st) {
1290312903
PyObject *StatVFSResultType = get_posix_state(module)->StatVFSResultType;
1290412904
PyObject *v = PyStructSequence_New((PyTypeObject *)StatVFSResultType);
12905-
if (v == NULL)
12905+
if (v == NULL) {
1290612906
return NULL;
12907+
}
1290712908

12908-
long flags = 0;
12909-
if (st.f_flags & MNT_RDONLY) {
12910-
flags |= ST_RDONLY;
12911-
}
12912-
if (st.f_flags & MNT_NOSUID) {
12913-
flags |= ST_NOSUID;
12914-
}
12909+
long flags = 0;
12910+
if (st.f_flags & MNT_RDONLY) {
12911+
flags |= ST_RDONLY;
12912+
}
12913+
if (st.f_flags & MNT_NOSUID) {
12914+
flags |= ST_NOSUID;
12915+
}
1291512916

12916-
_Static_assert(sizeof(st.f_blocks) == sizeof(long long), "assuming large file");
12917+
_Static_assert(sizeof(st.f_blocks) == sizeof(long long), "assuming large file");
1291712918

12918-
PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_iosize));
12919-
PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_bsize));
12920-
PyStructSequence_SET_ITEM(v, 2,
12921-
PyLong_FromLongLong((long long) st.f_blocks));
12922-
PyStructSequence_SET_ITEM(v, 3,
12923-
PyLong_FromLongLong((long long) st.f_bfree));
12924-
PyStructSequence_SET_ITEM(v, 4,
12925-
PyLong_FromLongLong((long long) st.f_bavail));
12926-
PyStructSequence_SET_ITEM(v, 5,
12927-
PyLong_FromLongLong((long long) st.f_files));
12928-
PyStructSequence_SET_ITEM(v, 6,
12929-
PyLong_FromLongLong((long long) st.f_ffree));
12930-
PyStructSequence_SET_ITEM(v, 7,
12931-
PyLong_FromLongLong((long long) st.f_ffree));
12932-
PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) flags));
12919+
#define SET_ITEM(v, index, item) \
12920+
do { \
12921+
if (item == NULL) { \
12922+
Py_DECREF(v); \
12923+
return NULL; \
12924+
} \
12925+
PyStructSequence_SET_ITEM(v, index, item); \
12926+
} while (0) \
1293312927

12934-
PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) NAME_MAX));
12935-
PyStructSequence_SET_ITEM(v, 10, PyLong_FromUnsignedLong(st.f_fsid.val[0]));
12936-
if (PyErr_Occurred()) {
12937-
Py_DECREF(v);
12938-
return NULL;
12939-
}
12928+
SET_ITEM(v, 0, PyLong_FromLong((long) st.f_iosize));
12929+
SET_ITEM(v, 1, PyLong_FromLong((long) st.f_bsize));
12930+
SET_ITEM(v, 2, PyLong_FromLongLong((long long) st.f_blocks));
12931+
SET_ITEM(v, 3, PyLong_FromLongLong((long long) st.f_bfree));
12932+
SET_ITEM(v, 4, PyLong_FromLongLong((long long) st.f_bavail));
12933+
SET_ITEM(v, 5, PyLong_FromLongLong((long long) st.f_files));
12934+
SET_ITEM(v, 6, PyLong_FromLongLong((long long) st.f_ffree));
12935+
SET_ITEM(v, 7, PyLong_FromLongLong((long long) st.f_ffree));
12936+
SET_ITEM(v, 8, PyLong_FromLong((long) flags));
12937+
12938+
SET_ITEM(v, 9, PyLong_FromLong((long) NAME_MAX));
12939+
SET_ITEM(v, 10, PyLong_FromUnsignedLong(st.f_fsid.val[0]));
12940+
12941+
#undef SET_ITEM
1294012942

1294112943
return v;
1294212944
}

0 commit comments

Comments
 (0)