diff options
author | Pablo Galindo <Pablogsal@gmail.com> | 2020-06-08 00:47:37 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-08 00:47:37 (GMT) |
commit | 972ab0327675e695373fc6272d5ac24e187579ad (patch) | |
tree | b5056a67e0f85f85d23ecf2bb08437efd1d41e69 | |
parent | bcb198385dee469d630a184182df9dc1463e2c47 (diff) | |
download | cpython-972ab0327675e695373fc6272d5ac24e187579ad.zip cpython-972ab0327675e695373fc6272d5ac24e187579ad.tar.gz cpython-972ab0327675e695373fc6272d5ac24e187579ad.tar.bz2 |
bpo-40904: Fix segfault in the new parser with f-string containing yield statements with no value (GH-20701)
-rw-r--r-- | Lib/test/test_fstring.py | 2 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2020-06-08-01-08-57.bpo-40904.76qQzo.rst | 2 | ||||
-rw-r--r-- | Parser/pegen/parse_string.c | 3 |
3 files changed, 7 insertions, 0 deletions
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index ea4e589..9048e89 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -725,9 +725,11 @@ non-important content # a function into a generator def fn(y): f'y:{yield y*2}' + f'{yield}' g = fn(4) self.assertEqual(next(g), 8) + self.assertEqual(next(g), None) def test_yield_send(self): def fn(x): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-08-01-08-57.bpo-40904.76qQzo.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-08-01-08-57.bpo-40904.76qQzo.rst new file mode 100644 index 0000000..09009b1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-08-01-08-57.bpo-40904.76qQzo.rst @@ -0,0 +1,2 @@ +Fix possible segfault in the new PEG parser when parsing f-string containing +yield statements with no value (:code:`f"{yield}"`). Patch by Pablo Galindo diff --git a/Parser/pegen/parse_string.c b/Parser/pegen/parse_string.c index efe82df..94241e1 100644 --- a/Parser/pegen/parse_string.c +++ b/Parser/pegen/parse_string.c @@ -278,6 +278,9 @@ static void fstring_shift_argument(expr_ty parent, arg_ty args, int lineno, int static inline void shift_expr(expr_ty parent, expr_ty n, int line, int col) { + if (n == NULL) { + return; + } if (parent->lineno < n->lineno) { col = 0; } |