Skip to content

Commit

Permalink
[3.12] GH-105840: Fix assertion failures when specializing calls with…
Browse files Browse the repository at this point in the history
… too many __defaults__ (GH-105863)

GH-105840: Fix assertion failures when specializing calls with too many __defaults__ (GH-105847)
(cherry picked from commit 2beab5b)

Co-authored-by: Brandt Bucher <brandtbucher@microsoft.com>
  • Loading branch information
miss-islington and brandtbucher committed Jun 16, 2023
1 parent 32c0aeb commit 560adb0
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 2 deletions.
29 changes: 29 additions & 0 deletions Lib/test/test_opcache.py
Expand Up @@ -452,6 +452,35 @@ def f():
self.assertFalse(f())


class TestCallCache(unittest.TestCase):
def test_too_many_defaults_0(self):
def f():
pass

f.__defaults__ = (None,)
for _ in range(1025):
f()

def test_too_many_defaults_1(self):
def f(x):
pass

f.__defaults__ = (None, None)
for _ in range(1025):
f(None)
f()

def test_too_many_defaults_2(self):
def f(x, y):
pass

f.__defaults__ = (None, None, None)
for _ in range(1025):
f(None, None)
f(None)
f()


if __name__ == "__main__":
import unittest
unittest.main()
@@ -0,0 +1,2 @@
Fix possible crashes when specializing function calls with too many
``__defaults__``.
4 changes: 2 additions & 2 deletions Python/specialize.c
Expand Up @@ -1666,9 +1666,9 @@ specialize_py_call(PyFunctionObject *func, _Py_CODEUNIT *instr, int nargs,
}
int argcount = code->co_argcount;
int defcount = func->func_defaults == NULL ? 0 : (int)PyTuple_GET_SIZE(func->func_defaults);
assert(defcount <= argcount);
int min_args = argcount-defcount;
if (nargs > argcount || nargs < min_args) {
// GH-105840: min_args is negative when somebody sets too many __defaults__!
if (min_args < 0 || nargs > argcount || nargs < min_args) {
SPECIALIZATION_FAIL(CALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS);
return -1;
}
Expand Down

0 comments on commit 560adb0

Please sign in to comment.