[3.14] gh-138479: Ensure that __typing_subst__ returns a tuple (GH-138482) (#138784)
Some checks are pending
Tests / Change detection (push) Waiting to run
Tests / Docs (push) Blocked by required conditions
Tests / Windows MSI (push) Blocked by required conditions
Tests / (push) Blocked by required conditions
Tests / Check if the ABI has changed (push) Blocked by required conditions
Tests / Check if Autoconf files are up to date (push) Blocked by required conditions
Tests / Check if generated files are up to date (push) Blocked by required conditions
Tests / Ubuntu SSL tests with OpenSSL (push) Blocked by required conditions
Tests / Android (aarch64) (push) Blocked by required conditions
Tests / Android (x86_64) (push) Blocked by required conditions
Tests / WASI (push) Blocked by required conditions
Tests / Hypothesis tests on Ubuntu (push) Blocked by required conditions
Tests / Address sanitizer (push) Blocked by required conditions
Tests / Sanitizers (push) Blocked by required conditions
Tests / Cross build Linux (push) Blocked by required conditions
Tests / CIFuzz (push) Blocked by required conditions
Tests / All required checks pass (push) Blocked by required conditions
Lint / lint (push) Waiting to run

Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Miss Islington (bot) 2025-09-12 15:23:03 +02:00 committed by GitHub
parent 440b83f838
commit fbfbfdf33c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 31 additions and 0 deletions

View file

@ -5797,6 +5797,23 @@ class GenericTests(BaseTestCase):
with self.assertRaises(TypeError):
a[int]
def test_return_non_tuple_while_unpacking(self):
# GH-138497: GenericAlias objects didn't ensure that __typing_subst__ actually
# returned a tuple
class EvilTypeVar:
__typing_is_unpacked_typevartuple__ = True
def __typing_prepare_subst__(*_):
return None # any value
def __typing_subst__(*_):
return 42 # not tuple
evil = EvilTypeVar()
# Create a dummy TypeAlias that will be given the evil generic from
# above.
type type_alias[*_] = 0
with self.assertRaisesRegex(TypeError, ".+__typing_subst__.+tuple.+int.*"):
type_alias[evil][0]
class ClassVarTests(BaseTestCase):

View file

@ -0,0 +1,2 @@
Fix a crash when a generic object's ``__typing_subst__`` returns an object
that isn't a :class:`tuple`.

View file

@ -525,12 +525,24 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje
return NULL;
}
if (unpack) {
if (!PyTuple_Check(arg)) {
Py_DECREF(newargs);
Py_DECREF(item);
Py_XDECREF(tuple_args);
PyObject *original = PyTuple_GET_ITEM(args, iarg);
PyErr_Format(PyExc_TypeError,
"expected __typing_subst__ of %T objects to return a tuple, not %T",
original, arg);
Py_DECREF(arg);
return NULL;
}
jarg = tuple_extend(&newargs, jarg,
&PyTuple_GET_ITEM(arg, 0), PyTuple_GET_SIZE(arg));
Py_DECREF(arg);
if (jarg < 0) {
Py_DECREF(item);
Py_XDECREF(tuple_args);
assert(newargs == NULL);
return NULL;
}
}