From 68874a8502da440a1dc4746cf73262648b870aee Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Sat, 6 Jun 2020 15:44:16 +0300 Subject: bpo-40870: Invalidate usage of some constants with ast.Name (GH-20649) --- Python/ast.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'Python/ast.c') diff --git a/Python/ast.c b/Python/ast.c index c524b8e34e8..408591f3253 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -21,6 +21,25 @@ static int validate_nonempty_seq(asdl_seq *, const char *, const char *); static int validate_stmt(stmt_ty); static int validate_expr(expr_ty, expr_context_ty); +static int +validate_name(PyObject *name) +{ + assert(PyUnicode_Check(name)); + static const char * const forbidden[] = { + "None", + "True", + "False", + NULL + }; + for (int i = 0; forbidden[i] != NULL; i++) { + if (_PyUnicode_EqualToASCIIString(name, forbidden[i])) { + PyErr_Format(PyExc_ValueError, "Name node can't be used with '%s' constant", forbidden[i]); + return 0; + } + } + return 1; +} + static int validate_comprehension(asdl_seq *gens) { @@ -173,6 +192,9 @@ validate_expr(expr_ty exp, expr_context_ty ctx) actual_ctx = exp->v.Starred.ctx; break; case Name_kind: + if (!validate_name(exp->v.Name.id)) { + return 0; + } actual_ctx = exp->v.Name.ctx; break; case List_kind: -- cgit v1.2.3