diff options
author | Lysandros Nikolaou <lisandrosnik@gmail.com> | 2020-06-21 02:18:01 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-21 02:18:01 (GMT) |
commit | 6c4e0bd974f2895d42b63d9d004587e74b286c88 (patch) | |
tree | 68e8df81c6375ba0e85e614f6afd92d867a901af /Grammar/python.gram | |
parent | 3ccb96c9782480e5ce646a4a130569fb92f2965d (diff) | |
download | cpython-6c4e0bd974f2895d42b63d9d004587e74b286c88.zip cpython-6c4e0bd974f2895d42b63d9d004587e74b286c88.tar.gz cpython-6c4e0bd974f2895d42b63d9d004587e74b286c88.tar.bz2 |
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/python.gram')
-rw-r--r-- | Grammar/python.gram | 23 |
1 files changed, 4 insertions, 19 deletions
diff --git a/Grammar/python.gram b/Grammar/python.gram index e4abca9..c5a5dbe 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 ')' { |