diff options
author | Karl Williamson <khw@cpan.org> | 2017-02-13 19:01:46 -0700 |
---|---|---|
committer | Karl Williamson <khw@cpan.org> | 2017-02-13 21:24:10 -0700 |
commit | f065e1e68bf6a5541c8ceba8c9fcc6e18f51a32b (patch) | |
tree | e5eb48b118b39cae84c6d853ed0ff80c584de72c /toke.c | |
parent | d43328d502ac91c4d98e218d0721cd5f3bcd3950 (diff) | |
download | perl-f065e1e68bf6a5541c8ceba8c9fcc6e18f51a32b.tar.gz |
Don't try to compile a pattern known to be in error
Regular expression patterns are parsed by the lexer/toker, and then
compiled by the regex compiler. It is foolish to try to compile one
that the parser has rejected as syntactically bad; assumptions may be
violated and segfaults ensue. This commit abandons all parsing
immediately if a pattern had errors in it. A better solution would be
to flag this pattern as not to be compiled, and continue parsing other
things so as to find the most errors in a single attempt, but I don't
think it's worth the extra effort.
Making this change caused some misleading error messages in the test
suite to be replaced by better ones.
Diffstat (limited to 'toke.c')
-rw-r--r-- | toke.c | 9 |
1 files changed, 9 insertions, 0 deletions
@@ -5021,7 +5021,16 @@ Perl_yylex(pTHX) s = PL_bufend; } else { + int save_error_count = PL_error_count; + s = scan_const(PL_bufptr); + + /* Quit if this was a pattern and there were errors. This prevents + * us from trying to regex compile a broken pattern, which could + * lead to segfaults, etc. */ + if (PL_lex_inpat && PL_error_count > save_error_count) { + yyquit(); + } if (*s == '\\') PL_lex_state = LEX_INTERPCASEMOD; else |