diff options
author | Karl Anderson <Karl.Anderson@safelinkhub.com> | 2021-10-28 08:53:52 +0100 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2022-07-15 01:39:42 +0900 |
commit | 509d0a92994e9b1ef497dbf84ed9e5faa1c8680d (patch) | |
tree | 7f8d8f8fb1dfe931772aa1180f4e0d55cd44f21a /ext/psych/psych_parser.c | |
parent | a5471b616d4ac3f450ef6faff03d9cb4228d9ddb (diff) | |
download | ruby-509d0a92994e9b1ef497dbf84ed9e5faa1c8680d.tar.gz |
[ruby/psych] Fix infinite loop bug after YAML_MEMORY_ERROR (psych issue #440)
https://github.com/ruby/psych/commit/6c56700fb2
Diffstat (limited to 'ext/psych/psych_parser.c')
-rw-r--r-- | ext/psych/psych_parser.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/ext/psych/psych_parser.c b/ext/psych/psych_parser.c index fd550b671a..f91475b835 100644 --- a/ext/psych/psych_parser.c +++ b/ext/psych/psych_parser.c @@ -79,21 +79,25 @@ static VALUE allocate(VALUE klass) static VALUE make_exception(yaml_parser_t * parser, VALUE path) { - size_t line, column; - VALUE ePsychSyntaxError; + if (parser->error == YAML_MEMORY_ERROR) { + return rb_eNoMemError; + } else { + size_t line, column; + VALUE ePsychSyntaxError; - line = parser->context_mark.line + 1; - column = parser->context_mark.column + 1; + line = parser->context_mark.line + 1; + column = parser->context_mark.column + 1; - ePsychSyntaxError = rb_const_get(mPsych, rb_intern("SyntaxError")); + ePsychSyntaxError = rb_const_get(mPsych, rb_intern("SyntaxError")); - return rb_funcall(ePsychSyntaxError, rb_intern("new"), 6, - path, - SIZET2NUM(line), - SIZET2NUM(column), - SIZET2NUM(parser->problem_offset), - parser->problem ? rb_usascii_str_new2(parser->problem) : Qnil, - parser->context ? rb_usascii_str_new2(parser->context) : Qnil); + return rb_funcall(ePsychSyntaxError, rb_intern("new"), 6, + path, + SIZET2NUM(line), + SIZET2NUM(column), + SIZET2NUM(parser->problem_offset), + parser->problem ? rb_usascii_str_new2(parser->problem) : Qnil, + parser->context ? rb_usascii_str_new2(parser->context) : Qnil); + } } static VALUE transcode_string(VALUE src, int * parser_encoding) @@ -293,7 +297,7 @@ static VALUE parse(int argc, VALUE *argv, VALUE self) VALUE event_args[5]; VALUE start_line, start_column, end_line, end_column; - if(!yaml_parser_parse(parser, &event)) { + if(parser->error || !yaml_parser_parse(parser, &event)) { VALUE exception; exception = make_exception(parser, path); |