gh-132713: Fix typing.Union[index] race condition (#132802)

Add union_init_parameters() helper function. Use a critical section
to initialize the 'parameters' member.
This commit is contained in:
Victor Stinner 2025-04-23 15:45:42 +02:00 committed by GitHub
parent 32c4bbe834
commit dc3e9638c2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -322,16 +322,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);
@ -352,11 +364,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);
}