Skip to content

Commit

Permalink
Fix emitter states handling when write_indicator fails
Browse files Browse the repository at this point in the history
There are cases where yaml_emitter_write_indicator fails.
In that case POP is called on emitter->indents but not on emitter->states,
which results in a leftover event in the stack, and later POP is called
on an empty emitter->indents stack.

This commit does not fix the case of the failing yaml_emitter_write_indicator.
This is still investigated.
  • Loading branch information
perlpunk committed Apr 8, 2024
1 parent 1e66c1e commit 82d96d5
Showing 1 changed file with 18 additions and 6 deletions.
24 changes: 18 additions & 6 deletions src/emitter.c
Original file line number Diff line number Diff line change
Expand Up @@ -760,13 +760,19 @@ yaml_emitter_emit_flow_sequence_item(yaml_emitter_t *emitter,
emitter->flow_level --;
emitter->indent = POP(emitter, emitter->indents);
if (emitter->canonical && !first) {
if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0))
if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0)) {
emitter->state = POP(emitter, emitter->states);
return 0;
if (!yaml_emitter_write_indent(emitter))
}
if (!yaml_emitter_write_indent(emitter)) {
emitter->state = POP(emitter, emitter->states);
return 0;
}
}
if (!yaml_emitter_write_indicator(emitter, "]", 0, 0, 0))
if (!yaml_emitter_write_indicator(emitter, "]", 0, 0, 0)) {
emitter->state = POP(emitter, emitter->states);
return 0;
}
emitter->state = POP(emitter, emitter->states);

return 1;
Expand Down Expand Up @@ -809,13 +815,19 @@ yaml_emitter_emit_flow_mapping_key(yaml_emitter_t *emitter,
emitter->flow_level --;
emitter->indent = POP(emitter, emitter->indents);
if (emitter->canonical && !first) {
if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0))
if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0)) {
emitter->state = POP(emitter, emitter->states);
return 0;
if (!yaml_emitter_write_indent(emitter))
}
if (!yaml_emitter_write_indent(emitter)) {
emitter->state = POP(emitter, emitter->states);
return 0;
}
}
if (!yaml_emitter_write_indicator(emitter, "}", 0, 0, 0))
if (!yaml_emitter_write_indicator(emitter, "}", 0, 0, 0)) {
emitter->state = POP(emitter, emitter->states);
return 0;
}
emitter->state = POP(emitter, emitter->states);

return 1;
Expand Down

0 comments on commit 82d96d5

Please sign in to comment.