]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-116714: Handle errors correctly in `PyFloat_GetInfo` (#116715)
authorNikita Sobolev <mail@sobolevn.me>
Wed, 13 Mar 2024 12:38:03 +0000 (15:38 +0300)
committerGitHub <noreply@github.com>
Wed, 13 Mar 2024 12:38:03 +0000 (12:38 +0000)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Objects/floatobject.c

index 37d2d312a6a0b78591c56f6c72525f13d3d25653..96227f2cf7d76fa2fbbad11a61a33357713a7ad4 100644 (file)
@@ -98,10 +98,18 @@ PyFloat_GetInfo(void)
         return NULL;
     }
 
-#define SetIntFlag(flag) \
-    PyStructSequence_SET_ITEM(floatinfo, pos++, PyLong_FromLong(flag))
-#define SetDblFlag(flag) \
-    PyStructSequence_SET_ITEM(floatinfo, pos++, PyFloat_FromDouble(flag))
+#define SetFlag(CALL) \
+    do {                                                    \
+        PyObject *flag = (CALL);                            \
+        if (flag == NULL) {                                 \
+            Py_CLEAR(floatinfo);                            \
+            return NULL;                                    \
+        }                                                   \
+        PyStructSequence_SET_ITEM(floatinfo, pos++, flag);  \
+    } while (0)
+
+#define SetIntFlag(FLAG) SetFlag(PyLong_FromLong((FLAG)))
+#define SetDblFlag(FLAG) SetFlag(PyFloat_FromDouble((FLAG)))
 
     SetDblFlag(DBL_MAX);
     SetIntFlag(DBL_MAX_EXP);
@@ -116,11 +124,8 @@ PyFloat_GetInfo(void)
     SetIntFlag(FLT_ROUNDS);
 #undef SetIntFlag
 #undef SetDblFlag
+#undef SetFlag
 
-    if (PyErr_Occurred()) {
-        Py_CLEAR(floatinfo);
-        return NULL;
-    }
     return floatinfo;
 }