gh-133516: Raise ValueError when constants True, False or None are used as an identifier after NFKC normalization (#133523)

This commit is contained in:
TERESH1 2025-05-07 21:11:25 +03:00 committed by GitHub
parent 942673ed19
commit d9b0b07098
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 28 additions and 0 deletions

View file

@ -821,6 +821,17 @@ class AST_Tests(unittest.TestCase):
with self.assertRaisesRegex(ValueError, f"identifier field can't represent '{constant}' constant"):
compile(expr, "<test>", "eval")
def test_constant_as_unicode_name(self):
constants = [
("True", b"Tru\xe1\xb5\x89"),
("False", b"Fal\xc5\xbfe"),
("None", b"N\xc2\xbane"),
]
for constant in constants:
with self.assertRaisesRegex(ValueError,
f"identifier field can't represent '{constant[0]}' constant"):
ast.parse(constant[1], mode="eval")
def test_precedence_enum(self):
class _Precedence(enum.IntEnum):
"""Precedence table that originated from python grammar."""

View file

@ -0,0 +1,2 @@
Raise :exc:`ValueError` when constants ``True``, ``False`` or ``None`` are
used as an identifier after NFKC normalization.

View file

@ -549,6 +549,21 @@ _PyPegen_new_identifier(Parser *p, const char *n)
}
id = id2;
}
static const char * const forbidden[] = {
"None",
"True",
"False",
NULL
};
for (int i = 0; forbidden[i] != NULL; i++) {
if (_PyUnicode_EqualToASCIIString(id, forbidden[i])) {
PyErr_Format(PyExc_ValueError,
"identifier field can't represent '%s' constant",
forbidden[i]);
Py_DECREF(id);
goto error;
}
}
PyInterpreterState *interp = _PyInterpreterState_GET();
_PyUnicode_InternImmortal(interp, &id);
if (_PyArena_AddPyObject(p->arena, id) < 0)