]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-100342: check for allocation failure in AC `*args` parsing (#100343)
authorKumar Aditya <59607654+kumaraditya303@users.noreply.github.com>
Wed, 28 Dec 2022 04:16:28 +0000 (09:46 +0530)
committerGitHub <noreply@github.com>
Wed, 28 Dec 2022 04:16:28 +0000 (09:46 +0530)
Lib/test/clinic.test
Misc/NEWS.d/next/Tools-Demos/2022-12-19-10-08-53.gh-issue-100342.qDFlQG.rst [new file with mode: 0644]
Modules/clinic/_testclinic.c.h
Tools/clinic/clinic.py

index 0d844234d9d1f614312ec0b806666b2a9729c30c..53e5df5ba872eda1d336d1b98055c03fbdc929e0 100644 (file)
@@ -3781,6 +3781,9 @@ test_vararg_and_posonly(PyObject *module, PyObject *const *args, Py_ssize_t narg
     }
     a = args[0];
     __clinic_args = PyTuple_New(nargs - 1);
+    if (!__clinic_args) {
+        goto exit;
+    }
     for (Py_ssize_t i = 0; i < nargs - 1; ++i) {
         PyTuple_SET_ITEM(__clinic_args, i, Py_NewRef(args[1 + i]));
     }
@@ -3793,7 +3796,7 @@ exit:
 
 static PyObject *
 test_vararg_and_posonly_impl(PyObject *module, PyObject *a, PyObject *args)
-/*[clinic end generated code: output=081a953b8cbe7617 input=08dc2bf7afbf1613]*/
+/*[clinic end generated code: output=79b75dc07decc8d6 input=08dc2bf7afbf1613]*/
 
 /*[clinic input]
 test_vararg
diff --git a/Misc/NEWS.d/next/Tools-Demos/2022-12-19-10-08-53.gh-issue-100342.qDFlQG.rst b/Misc/NEWS.d/next/Tools-Demos/2022-12-19-10-08-53.gh-issue-100342.qDFlQG.rst
new file mode 100644 (file)
index 0000000..28f7363
--- /dev/null
@@ -0,0 +1 @@
+Add missing ``NULL`` check for possible allocation failure in ``*args`` parsing in Argument Clinic.
index 21bde529470294b11935acb7757ae537893c1365..831f58ca650aabeac68b43f6f35c69635e3b7b25 100644 (file)
@@ -2409,6 +2409,9 @@ vararg_and_posonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     }
     a = args[0];
     __clinic_args = PyTuple_New(nargs - 1);
+    if (!__clinic_args) {
+        goto exit;
+    }
     for (Py_ssize_t i = 0; i < nargs - 1; ++i) {
         PyTuple_SET_ITEM(__clinic_args, i, Py_NewRef(args[1 + i]));
     }
@@ -2769,6 +2772,9 @@ gh_99233_refcount(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
         goto exit;
     }
     __clinic_args = PyTuple_New(nargs - 0);
+    if (!__clinic_args) {
+        goto exit;
+    }
     for (Py_ssize_t i = 0; i < nargs - 0; ++i) {
         PyTuple_SET_ITEM(__clinic_args, i, Py_NewRef(args[0 + i]));
     }
@@ -2811,4 +2817,4 @@ gh_99240_double_free(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=9a5ca5909c087102 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=e8211606b03d733a input=a9049054013a1b77]*/
index 2fb1902a5b546afd9883ce14519b9b997ebb9c95..552ed2c889a7b7da9a340c6df53a292d202e8968 100755 (executable)
@@ -960,12 +960,16 @@ class CLanguage(Language):
                     if not new_or_init:
                         parser_code.append(normalize_snippet("""
                             %s = PyTuple_New(%s);
+                            if (!%s) {{
+                                goto exit;
+                            }}
                             for (Py_ssize_t i = 0; i < %s; ++i) {{
                                 PyTuple_SET_ITEM(%s, i, Py_NewRef(args[%d + i]));
                             }}
                             """ % (
                                 p.converter.parser_name,
                                 left_args,
+                                p.converter.parser_name,
                                 left_args,
                                 p.converter.parser_name,
                                 max_pos