From 509d0a92994e9b1ef497dbf84ed9e5faa1c8680d Mon Sep 17 00:00:00 2001 From: Karl Anderson Date: Thu, 28 Oct 2021 08:53:52 +0100 Subject: [PATCH] [ruby/psych] Fix infinite loop bug after YAML_MEMORY_ERROR (psych issue #440) https://github.com/ruby/psych/commit/6c56700fb2 --- ext/psych/psych_parser.c | 30 +++++++++++++++++------------- 1 file 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);