From 341b86e095e59f849c80312ccdb5b70e00fa5216 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 23 Apr 2025 16:12:03 +0200 Subject: [PATCH] [3.13] gh-132713: Fix typing.Union[index] race condition (GH-132802) (#132839) gh-132713: Fix typing.Union[index] race condition (GH-132802) Add union_init_parameters() helper function. Use a critical section to initialize the 'parameters' member. (cherry picked from commit dc3e9638c22fc1fa807a88c32316ac2558a4b879) Co-authored-by: Victor Stinner --- Objects/unionobject.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/Objects/unionobject.c b/Objects/unionobject.c index bf5605686f8..79103bc2ac2 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -270,16 +270,28 @@ static PyMemberDef union_members[] = { {0} }; +// Populate __parameters__ if needed. +static int +union_init_parameters(unionobject *alias) +{ + int result = 0; + Py_BEGIN_CRITICAL_SECTION(alias); + if (alias->parameters == NULL) { + alias->parameters = _Py_make_parameters(alias->args); + if (alias->parameters == NULL) { + result = -1; + } + } + Py_END_CRITICAL_SECTION(); + return result; +} + static PyObject * union_getitem(PyObject *self, PyObject *item) { unionobject *alias = (unionobject *)self; - // Populate __parameters__ if needed. - if (alias->parameters == NULL) { - alias->parameters = _Py_make_parameters(alias->args); - if (alias->parameters == NULL) { - return NULL; - } + if (union_init_parameters(alias) < 0) { + return NULL; } PyObject *newargs = _Py_subs_parameters(self, alias->args, alias->parameters, item); @@ -314,11 +326,8 @@ static PyObject * union_parameters(PyObject *self, void *Py_UNUSED(unused)) { unionobject *alias = (unionobject *)self; - if (alias->parameters == NULL) { - alias->parameters = _Py_make_parameters(alias->args); - if (alias->parameters == NULL) { - return NULL; - } + if (union_init_parameters(alias) < 0) { + return NULL; } return Py_NewRef(alias->parameters); }