diff options
author | innokentii <innokentii@yandex-team.com> | 2023-06-03 13:38:33 +0300 |
---|---|---|
committer | innokentii <innokentii@yandex-team.com> | 2023-06-03 13:38:33 +0300 |
commit | 2017c5d3f28b1ef047abf57e8b9cb94726207dcf (patch) | |
tree | a7152f01bb94d6dfcf549f4e727957841c1d20cf /library/cpp/yaml | |
parent | 5e4b06300de780462487431f71d3d46d674edfce (diff) | |
download | ydb-2017c5d3f28b1ef047abf57e8b9cb94726207dcf.tar.gz |
Fix segv on EndMark
fix segv
Diffstat (limited to 'library/cpp/yaml')
-rw-r--r-- | library/cpp/yaml/fyamlcpp/fyamlcpp.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp b/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp index 2a6ad83a36..d006001b9e 100644 --- a/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp +++ b/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp @@ -329,6 +329,11 @@ TMark TNodeRef::BeginMark() const { fy_document_iterator_body_next(it.get()), deleter); auto* mark = fy_event_start_mark(ev.get()); + + if (!mark) { + ythrow yexception() << "can't get begin mark for a node"; + } + return TMark{ mark->input_pos, mark->line, @@ -370,6 +375,9 @@ TMark TNodeRef::EndMark() const { fy_document_iterator_node_start(it.get(), Node_); auto deleter = [&](fy_event* fye){ fy_document_iterator_event_free(it.get(), fye); }; + std::unique_ptr<fy_event, decltype(deleter)> prevEv( + nullptr, + deleter); std::unique_ptr<fy_event, decltype(deleter)> ev( fy_document_iterator_body_next(it.get()), deleter); @@ -396,12 +404,21 @@ TMark TNodeRef::EndMark() const { --openBrackets; } if (fy_event_get_node_style(cur.get()) != FYNS_BLOCK) { + prevEv.reset(ev.release()); ev.reset(cur.release()); } } } - const auto* mark = fy_event_end_mark(ev.get()); + auto* mark = fy_event_end_mark(ev.get()); + + if (!mark && prevEv) { + mark = fy_event_end_mark(prevEv.get()); + } + + if (!mark) { + ythrow yexception() << "can't get end mark for a node"; + } return TMark{ mark->input_pos, |