aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLysandros Nikolaou <lisandrosnik@gmail.com>2020-06-21 05:18:01 +0300
committerGitHub <noreply@github.com>2020-06-21 03:18:01 +0100
commit6c4e0bd974f2895d42b63d9d004587e74b286c88 (patch)
tree68e8df81c6375ba0e85e614f6afd92d867a901af /Grammar
parentbpo-41056: Use the fildes converter for fd to please Coverity. (GH-21011) (diff)
downloadcpython-6c4e0bd974f2895d42b63d9d004587e74b286c88.tar.gz
cpython-6c4e0bd974f2895d42b63d9d004587e74b286c88.tar.bz2
cpython-6c4e0bd974f2895d42b63d9d004587e74b286c88.zip
bpo-41060: Avoid SEGFAULT when calling GET_INVALID_TARGET in the grammar (GH-21020)
`GET_INVALID_TARGET` might unexpectedly return `NULL`, which if not caught will cause a SEGFAULT. Therefore, this commit introduces a new inline function `RAISE_SYNTAX_ERROR_INVALID_TARGET` that always checks for `GET_INVALID_TARGET` returning NULL and can be used in the grammar, replacing the long C ternary operation used till now.
Diffstat (limited to 'Grammar')
-rw-r--r--Grammar/python.gram23
1 files changed, 4 insertions, 19 deletions
diff --git a/Grammar/python.gram b/Grammar/python.gram
index e4abca9388e..c5a5dbe1724 100644
--- a/Grammar/python.gram
+++ b/Grammar/python.gram
@@ -653,9 +653,7 @@ invalid_assignment:
| a=expression ':' expression ['=' annotated_rhs] {
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "illegal target for annotation") }
| (star_targets '=')* a=star_expressions '=' {
- RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
- GET_INVALID_TARGET(a),
- "cannot assign to %s", _PyPegen_get_expr_name(GET_INVALID_TARGET(a))) }
+ RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) }
| (star_targets '=')* a=yield_expr '=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "assignment to yield expression not possible") }
| a=star_expressions augassign (yield_expr | star_expressions) {
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
@@ -665,12 +663,7 @@ invalid_assignment:
)}
invalid_del_stmt:
| 'del' a=star_expressions {
- GET_INVALID_DEL_TARGET(a) != NULL ?
- RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
- GET_INVALID_DEL_TARGET(a),
- "cannot delete %s", _PyPegen_get_expr_name(GET_INVALID_DEL_TARGET(a))
- ) :
- RAISE_SYNTAX_ERROR("invalid syntax") }
+ RAISE_SYNTAX_ERROR_INVALID_TARGET(DEL_TARGETS, a) }
invalid_block:
| NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block") }
invalid_comprehension:
@@ -695,19 +688,11 @@ invalid_double_type_comments:
RAISE_SYNTAX_ERROR("Cannot have two type comments on def") }
invalid_with_item:
| expression 'as' a=expression {
- RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
- GET_INVALID_TARGET(a),
- "cannot assign to %s", _PyPegen_get_expr_name(GET_INVALID_TARGET(a))
- ) }
+ RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) }
invalid_for_target:
| ASYNC? 'for' a=star_expressions {
- GET_INVALID_FOR_TARGET(a) != NULL ?
- RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
- GET_INVALID_FOR_TARGET(a),
- "cannot assign to %s", _PyPegen_get_expr_name(GET_INVALID_FOR_TARGET(a))
- ) :
- RAISE_SYNTAX_ERROR("invalid syntax") }
+ RAISE_SYNTAX_ERROR_INVALID_TARGET(FOR_TARGETS, a) }
invalid_group:
| '(' a=starred_expression ')' {