mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
[3.13] gh-140471: Fix buffer overflow in AST node initialization with malformed _fields (GH-140506) (#140510)
(cherry picked from commit 95953b692d)
This commit is contained in:
parent
adf0c11a26
commit
1cc2c954d6
4 changed files with 15 additions and 4 deletions
|
|
@ -3119,6 +3119,15 @@ class MoreFieldsThanTypes(ast.AST):
|
||||||
self.assertEqual(obj.a, 1)
|
self.assertEqual(obj.a, 1)
|
||||||
self.assertEqual(obj.b, 2)
|
self.assertEqual(obj.b, 2)
|
||||||
|
|
||||||
|
def test_malformed_fields_with_bytes(self):
|
||||||
|
class BadFields(ast.AST):
|
||||||
|
_fields = (b'\xff'*64,)
|
||||||
|
_field_types = {'a': int}
|
||||||
|
|
||||||
|
# This should not crash
|
||||||
|
with self.assertWarnsRegex(DeprecationWarning, r"Field b'\\xff\\xff.*' .*"):
|
||||||
|
obj = BadFields()
|
||||||
|
|
||||||
def test_complete_field_types(self):
|
def test_complete_field_types(self):
|
||||||
class _AllFieldTypes(ast.AST):
|
class _AllFieldTypes(ast.AST):
|
||||||
_fields = ("a", "b")
|
_fields = ("a", "b")
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix potential buffer overflow in :class:`ast.AST` node initialization when
|
||||||
|
encountering malformed :attr:`~ast.AST._fields` containing non-:class:`str`.
|
||||||
|
|
@ -1006,7 +1006,7 @@ def visitModule(self, mod):
|
||||||
else {
|
else {
|
||||||
if (PyErr_WarnFormat(
|
if (PyErr_WarnFormat(
|
||||||
PyExc_DeprecationWarning, 1,
|
PyExc_DeprecationWarning, 1,
|
||||||
"Field '%U' is missing from %.400s._field_types. "
|
"Field %R is missing from %.400s._field_types. "
|
||||||
"This will become an error in Python 3.15.",
|
"This will become an error in Python 3.15.",
|
||||||
name, Py_TYPE(self)->tp_name
|
name, Py_TYPE(self)->tp_name
|
||||||
) < 0) {
|
) < 0) {
|
||||||
|
|
@ -1041,7 +1041,7 @@ def visitModule(self, mod):
|
||||||
// simple field (e.g., identifier)
|
// simple field (e.g., identifier)
|
||||||
if (PyErr_WarnFormat(
|
if (PyErr_WarnFormat(
|
||||||
PyExc_DeprecationWarning, 1,
|
PyExc_DeprecationWarning, 1,
|
||||||
"%.400s.__init__ missing 1 required positional argument: '%U'. "
|
"%.400s.__init__ missing 1 required positional argument: %R. "
|
||||||
"This will become an error in Python 3.15.",
|
"This will become an error in Python 3.15.",
|
||||||
Py_TYPE(self)->tp_name, name
|
Py_TYPE(self)->tp_name, name
|
||||||
) < 0) {
|
) < 0) {
|
||||||
|
|
|
||||||
4
Python/Python-ast.c
generated
4
Python/Python-ast.c
generated
|
|
@ -5203,7 +5203,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
|
||||||
else {
|
else {
|
||||||
if (PyErr_WarnFormat(
|
if (PyErr_WarnFormat(
|
||||||
PyExc_DeprecationWarning, 1,
|
PyExc_DeprecationWarning, 1,
|
||||||
"Field '%U' is missing from %.400s._field_types. "
|
"Field %R is missing from %.400s._field_types. "
|
||||||
"This will become an error in Python 3.15.",
|
"This will become an error in Python 3.15.",
|
||||||
name, Py_TYPE(self)->tp_name
|
name, Py_TYPE(self)->tp_name
|
||||||
) < 0) {
|
) < 0) {
|
||||||
|
|
@ -5238,7 +5238,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
|
||||||
// simple field (e.g., identifier)
|
// simple field (e.g., identifier)
|
||||||
if (PyErr_WarnFormat(
|
if (PyErr_WarnFormat(
|
||||||
PyExc_DeprecationWarning, 1,
|
PyExc_DeprecationWarning, 1,
|
||||||
"%.400s.__init__ missing 1 required positional argument: '%U'. "
|
"%.400s.__init__ missing 1 required positional argument: %R. "
|
||||||
"This will become an error in Python 3.15.",
|
"This will become an error in Python 3.15.",
|
||||||
Py_TYPE(self)->tp_name, name
|
Py_TYPE(self)->tp_name, name
|
||||||
) < 0) {
|
) < 0) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue