From 09424550211089b059ff9ca255ee2e7e9aacc866 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Tue, 21 Jul 2026 13:29:57 +0300 Subject: [PATCH] [3.13] gh-154275: Do not crash on deeply nested `__parameters__` in `GenericAlias` (GH-154277) (#154340) * [3.13] gh-154275: Do not crash on deeply nested `__parameters__` in `GenericAlias` (GH-154277) (cherry picked from commit 1034e07b7d55642c3a46252e6b0a631c2df588d2) Co-authored-by: sobolevn --- ...-07-20-20-16-08.gh-issue-154275.l961cA.rst | 2 ++ Objects/genericaliasobject.c | 27 ++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-07-20-20-16-08.gh-issue-154275.l961cA.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-07-20-20-16-08.gh-issue-154275.l961cA.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-07-20-20-16-08.gh-issue-154275.l961cA.rst new file mode 100644 index 000000000000..998e91c77098 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-07-20-20-16-08.gh-issue-154275.l961cA.rst @@ -0,0 +1,2 @@ +Fix a crash when getting deeply nested ``__parameters__`` from a +:class:`types.GenericAlias` objects. diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 157facd16a7e..fb959dcefd8a 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -244,11 +244,16 @@ tuple_extend(PyObject **dst, Py_ssize_t dstindex, PyObject * _Py_make_parameters(PyObject *args) { + if (Py_EnterRecursiveCall(" in __parameter__ calculation")) { + return NULL; + } + Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t len = nargs; PyObject *parameters = PyTuple_New(len); - if (parameters == NULL) - return NULL; + if (parameters == NULL) { + goto cleanup; + } Py_ssize_t iparam = 0; for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { PyObject *t = PyTuple_GET_ITEM(args, iarg); @@ -258,8 +263,7 @@ _Py_make_parameters(PyObject *args) } int rc = PyObject_HasAttrWithError(t, &_Py_ID(__typing_subst__)); if (rc < 0) { - Py_DECREF(parameters); - return NULL; + goto error; } if (rc) { iparam += tuple_add(parameters, iparam, t); @@ -268,8 +272,7 @@ _Py_make_parameters(PyObject *args) PyObject *subparams; if (PyObject_GetOptionalAttr(t, &_Py_ID(__parameters__), &subparams) < 0) { - Py_DECREF(parameters); - return NULL; + goto error; } if (subparams && PyTuple_Check(subparams)) { Py_ssize_t len2 = PyTuple_GET_SIZE(subparams); @@ -278,7 +281,7 @@ _Py_make_parameters(PyObject *args) len += needed; if (_PyTuple_Resize(¶meters, len) < 0) { Py_DECREF(subparams); - return NULL; + goto cleanup; } } for (Py_ssize_t j = 0; j < len2; j++) { @@ -291,11 +294,17 @@ _Py_make_parameters(PyObject *args) } if (iparam < len) { if (_PyTuple_Resize(¶meters, iparam) < 0) { - Py_XDECREF(parameters); - return NULL; + goto error; } } + Py_LeaveRecursiveCall(); return parameters; + +error: + Py_XDECREF(parameters); +cleanup: + Py_LeaveRecursiveCall(); + return NULL; } /* If obj is a generic alias, substitute type variables params -- 2.47.3