Skip to content

Conversation

ZeroIntensity
Copy link
Member

@ZeroIntensity ZeroIntensity commented Sep 3, 2025

Raise an exception if __typing_subst__ returns a non-tuple object.

The test case is a little messy because it's based on fuzzer-generated code, so I can come up with my own repro if people aren't happy with using it.

return NULL;
}
if (unpack) {
if (!PyTuple_Check(arg)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we care about tuple subclasses here? If so, do we want to test this? Or use PyTuple_CheckExact?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would be fine to do either. It would technically be a breaking change to disallow tuple subclasses here, but I doubt anyone is actually doing that in practice.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's an internal undocumented API so I wouldn't feel terrible about disallowing tuple subclasses, but we could go either way.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's just use PyTuple_Check for the time being. There's no drawback to keeping subclass support here, so we might as well keep it.

"expected a tuple, not %T", arg);
Py_DECREF(arg);
return NULL;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't comment there but are we leaking newargs on line 543 below?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like it. Do you want me to fix that in this PR?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, might as well.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

@AlexWaygood AlexWaygood removed their request for review September 6, 2025 07:41
if (jarg < 0) {
Py_DECREF(item);
Py_XDECREF(tuple_args);
Py_DECREF(newargs);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is NULL here.

Copy link
Member Author

@ZeroIntensity ZeroIntensity Sep 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, tuple_extend steals the reference on failure. I added a comment here instead. Thanks for clearing this up.

Py_DECREF(item);
Py_XDECREF(tuple_args);
PyErr_Format(PyExc_TypeError,
"expected a tuple, not %T", arg);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is not helpful. Please add what method of what type has been called (this was method __typing_subst__ of original argument PyTuple_GET_ITEM(args, iarg)).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, it's now expected __typing_subst__ of %T objects to return a tuple, not %T. Is that good?

ZeroIntensity and others added 2 commits September 6, 2025 10:18
Co-authored-by: Serhiy Storchaka <[email protected]>
Also fix incorrect DECREF.

evil = EvilTypeVar()
type type_alias[*_] = 0
with self.assertRaises(TypeError):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please test an error message? No need to test the full match, just some unique pattern to ensure that this is an expected TypeError.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Copy link
Member

@vstinner vstinner left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. The change does fix the crash.

@ZeroIntensity
Copy link
Member Author

@serhiy-storchaka Would you like to finish up your review? If not, I'll merge this.

Copy link
Member

@serhiy-storchaka serhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. 👍

@ZeroIntensity ZeroIntensity merged commit 1da989b into python:main Sep 11, 2025
45 checks passed
@ZeroIntensity ZeroIntensity deleted the gh-138479-unpack-crash branch September 11, 2025 10:39
@miss-islington-app
Copy link

Thanks @ZeroIntensity for the PR 🌮🎉.. I'm working now to backport this PR to: 3.13, 3.14.
🐍🍒⛏🤖

miss-islington pushed a commit to miss-islington/cpython that referenced this pull request Sep 11, 2025
…onGH-138482)

Raise an exception if __typing_subst__ returns a non-tuple object.

---------
(cherry picked from commit 1da989b)

Co-authored-by: Peter Bierma <[email protected]>
Co-authored-by: Serhiy Storchaka <[email protected]>
@miss-islington-app
Copy link

Sorry, @ZeroIntensity, I could not cleanly backport this to 3.13 due to a conflict.
Please backport using cherry_picker on command line.

cherry_picker 1da989be74eaa94590ec28e750e5352de1ead227 3.13

@bedevere-app
Copy link

bedevere-app bot commented Sep 11, 2025

GH-138784 is a backport of this pull request to the 3.14 branch.

@bedevere-app bedevere-app bot removed the needs backport to 3.14 bugs and security fixes label Sep 11, 2025
@bedevere-app
Copy link

bedevere-app bot commented Sep 11, 2025

GH-138786 is a backport of this pull request to the 3.13 branch.

@bedevere-app bedevere-app bot removed the needs backport to 3.13 bugs and security fixes label Sep 11, 2025
ZeroIntensity added a commit to ZeroIntensity/cpython that referenced this pull request Sep 11, 2025
…onGH-138482)

Raise an exception if __typing_subst__ returns a non-tuple object.

---------

Co-authored-by: Serhiy Storchaka <[email protected]>
(cherry picked from commit 1da989b)
ZeroIntensity added a commit to ZeroIntensity/cpython that referenced this pull request Sep 11, 2025
pythonGH-138482)

Raise an exception if __typing_subst__ returns a non-tuple object.

---------
(cherry picked from commit 1da989b)

Co-authored-by: Peter Bierma <[email protected]>
Co-authored-by: Serhiy Storchaka <[email protected]>
ZeroIntensity added a commit that referenced this pull request Sep 11, 2025
…138482) (GH-138786)

* gh-138479: Ensure that `__typing_subst__` returns a tuple (GH-138482)

Raise an exception if __typing_subst__ returns a non-tuple object.

(cherry picked from commit 1da989b)

Co-authored-by: Serhiy Storchaka <[email protected]>
hugovk pushed a commit that referenced this pull request Sep 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants