Skip to content

Commit

Permalink
fix(eval): do not panic when encountering a YAML alias in `std.parseY…
Browse files Browse the repository at this point in the history
…aml`
  • Loading branch information
eduardosm committed Aug 2, 2024
1 parent aebb756 commit 5aeb96f
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
- Detect stack overflow while converting arrays and objects to string.
- Avoid panic when encountering an array or object as object key in
`std.parseYaml`.
- Avoid panic when encountering a YAML alias in `std.parseYaml`.

## 0.1.2 (2024-07-20)

Expand Down
11 changes: 11 additions & 0 deletions rsjsonnet-lang/src/program/eval/parse_yaml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ pub(crate) enum ParseError {
Stream,
EmptyStream,
Anchor,
Alias,
Tag,
KeyIsObject(libyaml_safer::Mark),
KeyIsArray(libyaml_safer::Mark),
Expand All @@ -32,6 +33,7 @@ impl std::fmt::Display for ParseError {
Self::Stream => write!(f, "YAML stream not allowed"),
Self::EmptyStream => write!(f, "empty stream"),
Self::Anchor => write!(f, "anchors are not allowed"),
Self::Alias => write!(f, "aliases are not allowed"),
Self::Tag => write!(f, "tags are not allowed"),
Self::KeyIsObject(ref mark) => write!(f, "{mark}: object key is an object"),
Self::KeyIsArray(ref mark) => write!(f, "{mark}: object key is an array"),
Expand Down Expand Up @@ -127,6 +129,9 @@ pub(super) fn parse_yaml_document(
let mut event = parser.parse()?;
loop {
let mut value = match event.data {
libyaml_safer::EventData::Alias { .. } => {
return Err(ParseError::Alias);
}
libyaml_safer::EventData::Scalar {
anchor,
tag,
Expand Down Expand Up @@ -185,6 +190,9 @@ pub(super) fn parse_yaml_document(
}
event = parser.parse()?;
match event.data {
libyaml_safer::EventData::Alias { .. } => {
return Err(ParseError::Alias);
}
libyaml_safer::EventData::SequenceStart { .. } => {
return Err(ParseError::KeyIsArray(event.start_mark));
}
Expand Down Expand Up @@ -238,6 +246,9 @@ pub(super) fn parse_yaml_document(
}

match event.data {
libyaml_safer::EventData::Alias { .. } => {
return Err(ParseError::Alias);
}
libyaml_safer::EventData::SequenceStart { .. } => {
return Err(ParseError::KeyIsArray(event.start_mark));
}
Expand Down
1 change: 1 addition & 0 deletions ui-tests/fail/stdlib/parseYaml/alias.jsonnet
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
std.parseYaml("a: *alias")
8 changes: 8 additions & 0 deletions ui-tests/fail/stdlib/parseYaml/alias.jsonnet.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: failed to parse YAML: aliases are not allowed
note: while evaluating call to `parseYaml`
--> alias.jsonnet:1:1
|
1 | std.parseYaml("a: *alias")
| --------------------------
note: during top-level value evaluation

1 change: 1 addition & 0 deletions ui-tests/fail/stdlib/parseYaml/alias_key0.jsonnet
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
std.parseYaml("*alias: 1")
8 changes: 8 additions & 0 deletions ui-tests/fail/stdlib/parseYaml/alias_key0.jsonnet.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: failed to parse YAML: aliases are not allowed
note: while evaluating call to `parseYaml`
--> alias_key0.jsonnet:1:1
|
1 | std.parseYaml("*alias: 1")
| --------------------------
note: during top-level value evaluation

1 change: 1 addition & 0 deletions ui-tests/fail/stdlib/parseYaml/alias_key1.jsonnet
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
std.parseYaml("a: 1\n*alias: 2")
8 changes: 8 additions & 0 deletions ui-tests/fail/stdlib/parseYaml/alias_key1.jsonnet.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: failed to parse YAML: aliases are not allowed
note: while evaluating call to `parseYaml`
--> alias_key1.jsonnet:1:1
|
1 | std.parseYaml("a: 1\n*alias: 2")
| --------------------------------
note: during top-level value evaluation

0 comments on commit 5aeb96f

Please sign in to comment.