mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
[3.14] gh-132775: Fix _PyFunctIon_VerifyStateless() (gh-134901)
gh-132775: Fix _PyFunctIon_VerifyStateless() ()
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.
(cherry picked from commit dafd14146f
, AKA gh-134900)
Co-authored-by: Eric Snow <ericsnowcurrently@gmail.com>
This commit is contained in:
parent
4670dddbf6
commit
9c2e0febb4
1 changed files with 20 additions and 14 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue