diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-09-09-13-13-27.gh-issue-96678.vMxi9F.rst b/Misc/NEWS.d/next/Core and Builtins/2022-09-09-13-13-27.gh-issue-96678.vMxi9F.rst new file mode 100644 index 0000000000000000000000000000000000000000..575b52be2940dc3f8178009cd77940cc029236d1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-09-09-13-13-27.gh-issue-96678.vMxi9F.rst @@ -0,0 +1 @@ +Fix case of undefined behavior in ceval.c diff --git a/Python/ceval.c b/Python/ceval.c index 461439b1edae37a8a31c48f68395cbcfb221118e..66fa2eabbdc91a8e04f03e205d407486bf88c567 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -6166,7 +6166,13 @@ initialize_locals(PyThreadState *tstate, PyFunctionObject *func, /* Pack other positional arguments into the *args argument */ if (co->co_flags & CO_VARARGS) { PyObject *u = NULL; - u = _PyTuple_FromArraySteal(args + n, argcount - n); + if (argcount == n) { + u = Py_NewRef(&_Py_SINGLETON(tuple_empty)); + } + else { + assert(args != NULL); + u = _PyTuple_FromArraySteal(args + n, argcount - n); + } if (u == NULL) { goto fail_post_positional; }