https://github.com/python/cpython/commit/dc3e9638c22fc1fa807a88c32316ac2558a4b879
commit: dc3e9638c22fc1fa807a88c32316ac2558a4b879
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2025-04-23T15:45:42+02:00
summary:
gh-132713: Fix typing.Union[index] race condition (#132802)
Add union_init_parameters() helper function. Use a critical section
to initialize the 'parameters' member.
files:
M Objects/unionobject.c
diff --git a/Objects/unionobject.c b/Objects/unionobject.c
index 0b7d4c72bffb97..66435924b6c6c3 100644
--- a/Objects/unionobject.c
+++ b/Objects/unionobject.c
@@ -322,17 +322,29 @@ static PyMemberDef union_members[] = {
{0}
};
-static PyObject *
-union_getitem(PyObject *self, PyObject *item)
+// Populate __parameters__ if needed.
+static int
+union_init_parameters(unionobject *alias)
{
- unionobject *alias = (unionobject *)self;
- // Populate __parameters__ if needed.
+ int result = 0;
+ Py_BEGIN_CRITICAL_SECTION(alias);
if (alias->parameters == NULL) {
alias->parameters = _Py_make_parameters(alias->args);
if (alias->parameters == NULL) {
- return NULL;
+ result = -1;
}
}
+ Py_END_CRITICAL_SECTION();
+ return result;
+}
+
+static PyObject *
+union_getitem(PyObject *self, PyObject *item)
+{
+ unionobject *alias = (unionobject *)self;
+ if (union_init_parameters(alias) < 0) {
+ return NULL;
+ }
PyObject *newargs = _Py_subs_parameters(self, alias->args,
alias->parameters, item);
if (newargs == NULL) {
@@ -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);
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]