mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
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:
parent
32c4bbe834
commit
dc3e9638c2
1 changed files with 20 additions and 11 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue