aboutsummaryrefslogtreecommitdiffstats
path: root/ext/psych/psych_parser.c
diff options
context:
space:
mode:
authorKarl Anderson <Karl.Anderson@safelinkhub.com>2021-10-28 08:53:52 +0100
committergit <svn-admin@ruby-lang.org>2022-07-15 01:39:42 +0900
commit509d0a92994e9b1ef497dbf84ed9e5faa1c8680d (patch)
tree7f8d8f8fb1dfe931772aa1180f4e0d55cd44f21a /ext/psych/psych_parser.c
parenta5471b616d4ac3f450ef6faff03d9cb4228d9ddb (diff)
downloadruby-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.c30
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);