From dd821c26a169eaeba291a727baee63d7cac57caf Mon Sep 17 00:00:00 2001 From: sobolevn Date: Mon, 12 Feb 2024 17:08:21 +0300 Subject: [PATCH 1/6] gh-87804: Fix the refleak in error handling of `_pystatvfs_fromstructstatfs` --- Modules/posixmodule.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 17032d9d490c78..ca1af2d7d8f05c 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -12916,14 +12916,15 @@ _pystatvfs_fromstructstatfs(PyObject *module, struct statfs st) { _Static_assert(sizeof(st.f_blocks) == sizeof(long long), "assuming large file"); -#define SET_ITEM(v, index, item) \ - do { \ - if (item == NULL) { \ - Py_DECREF(v); \ - return NULL; \ - } \ - PyStructSequence_SET_ITEM(v, index, item); \ - } while (0) \ +#define SET_ITEM(v, index, expr) \ + do { \ + PyObject *obj = (expr); \ + if (obj == NULL || PyErr_Occurred()) { \ + Py_DECREF(v); \ + return NULL; \ + } \ + PyStructSequence_SET_ITEM(v, (index), obj); \ + } while (0) \ SET_ITEM(v, 0, PyLong_FromLong((long) st.f_iosize)); SET_ITEM(v, 1, PyLong_FromLong((long) st.f_bsize)); From 58e1e45653d07ff97c307bc8858613e96f3f7040 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Mon, 12 Feb 2024 17:16:44 +0300 Subject: [PATCH 2/6] Remove the last `/` --- Modules/posixmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index ca1af2d7d8f05c..d78c1319e88508 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -12924,7 +12924,7 @@ _pystatvfs_fromstructstatfs(PyObject *module, struct statfs st) { return NULL; \ } \ PyStructSequence_SET_ITEM(v, (index), obj); \ - } while (0) \ + } while (0) SET_ITEM(v, 0, PyLong_FromLong((long) st.f_iosize)); SET_ITEM(v, 1, PyLong_FromLong((long) st.f_bsize)); From d1da0a2a46cf9a477e5aa4df083975b9ebff2ffe Mon Sep 17 00:00:00 2001 From: sobolevn Date: Mon, 12 Feb 2024 17:18:21 +0300 Subject: [PATCH 3/6] ALL_CAPS --- Modules/posixmodule.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index d78c1319e88508..f5f67d963ada70 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -12916,14 +12916,14 @@ _pystatvfs_fromstructstatfs(PyObject *module, struct statfs st) { _Static_assert(sizeof(st.f_blocks) == sizeof(long long), "assuming large file"); -#define SET_ITEM(v, index, expr) \ +#define SET_ITEM(V, INDEX, EXPR) \ do { \ - PyObject *obj = (expr); \ + PyObject *obj = (EXPR); \ if (obj == NULL || PyErr_Occurred()) { \ - Py_DECREF(v); \ + Py_DECREF(V); \ return NULL; \ } \ - PyStructSequence_SET_ITEM(v, (index), obj); \ + PyStructSequence_SET_ITEM(V, (INDEX), obj); \ } while (0) SET_ITEM(v, 0, PyLong_FromLong((long) st.f_iosize)); From 3c6388bada3855730bedcecc80db2ebf23c90a9c Mon Sep 17 00:00:00 2001 From: sobolevn Date: Mon, 12 Feb 2024 17:20:52 +0300 Subject: [PATCH 4/6] All () --- Modules/posixmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index f5f67d963ada70..650c2cbf0807f9 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -12920,10 +12920,10 @@ _pystatvfs_fromstructstatfs(PyObject *module, struct statfs st) { do { \ PyObject *obj = (EXPR); \ if (obj == NULL || PyErr_Occurred()) { \ - Py_DECREF(V); \ + Py_DECREF((V)); \ return NULL; \ } \ - PyStructSequence_SET_ITEM(V, (INDEX), obj); \ + PyStructSequence_SET_ITEM((V), (INDEX), obj); \ } while (0) SET_ITEM(v, 0, PyLong_FromLong((long) st.f_iosize)); From bbf56991fbbde269446d0cb9a5966c72f4f24b09 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Mon, 12 Feb 2024 17:52:20 +0300 Subject: [PATCH 5/6] Address Victor's review --- Modules/posixmodule.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 650c2cbf0807f9..95fd2360363ffe 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -12916,13 +12916,13 @@ _pystatvfs_fromstructstatfs(PyObject *module, struct statfs st) { _Static_assert(sizeof(st.f_blocks) == sizeof(long long), "assuming large file"); -#define SET_ITEM(V, INDEX, EXPR) \ - do { \ - PyObject *obj = (EXPR); \ - if (obj == NULL || PyErr_Occurred()) { \ +#define SET_ITEM(V, INDEX, EXPR) \ + do { \ + PyObject *obj = (EXPR); \ + if (obj == NULL) { \ Py_DECREF((V)); \ - return NULL; \ - } \ + return NULL; \ + } \ PyStructSequence_SET_ITEM((V), (INDEX), obj); \ } while (0) From 5e12106d2238cec3e7ef7b6f73ffbd4b69ab80ae Mon Sep 17 00:00:00 2001 From: sobolevn Date: Mon, 12 Feb 2024 18:00:13 +0300 Subject: [PATCH 6/6] Rename `V` -> `SEQ` --- Modules/posixmodule.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 95fd2360363ffe..ef6d65623bf038 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -12916,14 +12916,14 @@ _pystatvfs_fromstructstatfs(PyObject *module, struct statfs st) { _Static_assert(sizeof(st.f_blocks) == sizeof(long long), "assuming large file"); -#define SET_ITEM(V, INDEX, EXPR) \ - do { \ - PyObject *obj = (EXPR); \ - if (obj == NULL) { \ - Py_DECREF((V)); \ - return NULL; \ - } \ - PyStructSequence_SET_ITEM((V), (INDEX), obj); \ +#define SET_ITEM(SEQ, INDEX, EXPR) \ + do { \ + PyObject *obj = (EXPR); \ + if (obj == NULL) { \ + Py_DECREF((SEQ)); \ + return NULL; \ + } \ + PyStructSequence_SET_ITEM((SEQ), (INDEX), obj); \ } while (0) SET_ITEM(v, 0, PyLong_FromLong((long) st.f_iosize));