diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2022-01-25 03:08:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-25 03:08:42 (GMT) |
commit | c314e3e829943b186e1c894071f00c613433cfe5 (patch) | |
tree | 4e8b197edae641028a96a8c19d82e927479ff752 /Parser/pegen/parse_string.c | |
parent | 3f1ea163ea54513e00e0e9d5442fee1b639825cc (diff) | |
download | cpython-c314e3e829943b186e1c894071f00c613433cfe5.zip cpython-c314e3e829943b186e1c894071f00c613433cfe5.tar.gz cpython-c314e3e829943b186e1c894071f00c613433cfe5.tar.bz2 |
bpo-46503: Prevent an assert from firing when parsing some invalid \N sequences in f-strings. (GH-30865) (30867)
* bpo-46503: Prevent an assert from firing. Also fix one nearby tiny PEP-7 nit.
* Added blurb.
(cherry picked from commit 0daf72194bd4e31de7f12020685bb39a14d6f45e)
Co-authored-by: Eric V. Smith <ericvsmith@users.noreply.github.com>
Co-authored-by: Eric V. Smith <ericvsmith@users.noreply.github.com>
Diffstat (limited to 'Parser/pegen/parse_string.c')
-rw-r--r-- | Parser/pegen/parse_string.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/Parser/pegen/parse_string.c b/Parser/pegen/parse_string.c index f1df2c4..af350b3 100644 --- a/Parser/pegen/parse_string.c +++ b/Parser/pegen/parse_string.c @@ -444,12 +444,23 @@ fstring_find_literal(Parser *p, const char **str, const char *end, int raw, if (!raw && ch == '\\' && s < end) { ch = *s++; if (ch == 'N') { + /* We need to look at and skip matching braces for "\N{name}" + sequences because otherwise we'll think the opening '{' + starts an expression, which is not the case with "\N". + Keep looking for either a matched '{' '}' pair, or the end + of the string. */ + if (s < end && *s++ == '{') { while (s < end && *s++ != '}') { } continue; } - break; + + /* This is an invalid "\N" sequence, since it's a "\N" not + followed by a "{". Just keep parsing this literal. This + error will be caught later by + decode_unicode_with_escapes(). */ + continue; } if (ch == '{' && warn_invalid_escape_sequence(p, ch, t) < 0) { return -1; @@ -493,7 +504,8 @@ done: *literal = PyUnicode_DecodeUTF8Stateful(literal_start, s - literal_start, NULL, NULL); - } else { + } + else { *literal = decode_unicode_with_escapes(p, literal_start, s - literal_start, t); } |