gh-132775: Fix _PyFunctIon_VerifyStateless() (#134900)

The problem we're fixing here is that we were using PyDict_Size() on "defaults",
which it is actually a tuple.  We're also adding some explicit type checks.

This is a follow-up to gh-133221/gh-133528.
This commit is contained in:
Eric Snow 2025-05-29 14:13:12 -06:00 committed by GitHub
parent d96343679f
commit dafd14146f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1264,26 +1264,32 @@ _PyFunction_VerifyStateless(PyThreadState *tstate, PyObject *func)
}
// Disallow __defaults__.
PyObject *defaults = PyFunction_GET_DEFAULTS(func);
if (defaults != NULL && defaults != Py_None && PyDict_Size(defaults) > 0)
{
_PyErr_SetString(tstate, PyExc_ValueError, "defaults not supported");
return -1;
if (defaults != NULL) {
assert(PyTuple_Check(defaults)); // per PyFunction_New()
if (PyTuple_GET_SIZE(defaults) > 0) {
_PyErr_SetString(tstate, PyExc_ValueError,
"defaults not supported");
return -1;
}
}
// Disallow __kwdefaults__.
PyObject *kwdefaults = PyFunction_GET_KW_DEFAULTS(func);
if (kwdefaults != NULL && kwdefaults != Py_None
&& PyDict_Size(kwdefaults) > 0)
{
_PyErr_SetString(tstate, PyExc_ValueError,
"keyword defaults not supported");
return -1;
if (kwdefaults != NULL) {
assert(PyDict_Check(kwdefaults)); // per PyFunction_New()
if (PyDict_Size(kwdefaults) > 0) {
_PyErr_SetString(tstate, PyExc_ValueError,
"keyword defaults not supported");
return -1;
}
}
// Disallow __closure__.
PyObject *closure = PyFunction_GET_CLOSURE(func);
if (closure != NULL && closure != Py_None && PyTuple_GET_SIZE(closure) > 0)
{
_PyErr_SetString(tstate, PyExc_ValueError, "closures not supported");
return -1;
if (closure != NULL) {
assert(PyTuple_Check(closure)); // per PyFunction_New()
if (PyTuple_GET_SIZE(closure) > 0) {
_PyErr_SetString(tstate, PyExc_ValueError, "closures not supported");
return -1;
}
}
// Check the code.
PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);