aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yaml
diff options
context:
space:
mode:
authorinnokentii <innokentii@yandex-team.com>2023-06-03 13:38:33 +0300
committerinnokentii <innokentii@yandex-team.com>2023-06-03 13:38:33 +0300
commit2017c5d3f28b1ef047abf57e8b9cb94726207dcf (patch)
treea7152f01bb94d6dfcf549f4e727957841c1d20cf /library/cpp/yaml
parent5e4b06300de780462487431f71d3d46d674edfce (diff)
downloadydb-2017c5d3f28b1ef047abf57e8b9cb94726207dcf.tar.gz
Fix segv on EndMark
fix segv
Diffstat (limited to 'library/cpp/yaml')
-rw-r--r--library/cpp/yaml/fyamlcpp/fyamlcpp.cpp19
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,