diff --git a/lib/YAML/Loader.pm b/lib/YAML/Loader.pm index 1d45fa0..75b401f 100644 --- a/lib/YAML/Loader.pm +++ b/lib/YAML/Loader.pm @@ -526,33 +526,43 @@ sub _parse_inline_seq { # Parse the inline double quoted string. sub _parse_inline_double_quoted { my $self = shift; - my $node; - # https://rt.cpan.org/Public/Bug/Display.html?id=90593 - if ($self->inline =~ /^"((?:(?:\\"|[^"]){0,32766}){0,32766})"\s*(.*)$/) { - $node = $1; - $self->inline($2); - $node =~ s/\\"/"/g; - } - else { - $self->die('YAML_PARSE_ERR_BAD_DOUBLE'); + my $inline = $self->inline; + if ($inline =~ s/^"//) { + my $node = ''; + + while ($inline =~ s/^(\\.|[^"\\]+)//) { + my $capture = $1; + $capture =~ s/^\\"/"/; + $node .= $capture; + last unless length $inline; + } + if ($inline =~ s/^"\s*//) { + $self->inline($inline); + return $node; + } } - return $node; + $self->die('YAML_PARSE_ERR_BAD_DOUBLE'); } # Parse the inline single quoted string. sub _parse_inline_single_quoted { my $self = shift; - my $node; - if ($self->inline =~ /^'((?:(?:''|[^']){0,32766}){0,32766})'\s*(.*)$/) { - $node = $1; - $self->inline($2); - $node =~ s/''/'/g; - } - else { - $self->die('YAML_PARSE_ERR_BAD_SINGLE'); + my $inline = $self->inline; + if ($inline =~ s/^'//) { + my $node = ''; + while ($inline =~ s/^(''|[^']+)//) { + my $capture = $1; + $capture =~ s/^''/'/; + $node .= $capture; + last unless length $inline; + } + if ($inline =~ s/^'\s*//) { + $self->inline($inline); + return $node; + } } - return $node; + $self->die('YAML_PARSE_ERR_BAD_SINGLE'); } # Parse the inline unquoted string and do implicit typing. diff --git a/test/2-scalars.t b/test/2-scalars.t index ae4f021..77ac80b 100644 --- a/test/2-scalars.t +++ b/test/2-scalars.t @@ -34,4 +34,27 @@ if ($^V ge v5.9.0) { is(Load(Dump($Data)), $Data); } +{ + my $yaml1 = <<'EOM'; +a: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +b: 2 +EOM + my $yaml2 = <<'EOM'; +a: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +b: 2 +EOM + my $error; + eval { + my @data = Load($yaml1); + }; + $error = $@; + cmp_ok($error, '=~', "Can't parse single", "Single quoted without end"); + + eval { + my @data = Load($yaml2); + }; + $error = $@; + cmp_ok($error, '=~', "Can't parse double", "Double quoted without end"); +} + done_testing;