From 7f905f01df1677ffe7c301fbd3c7c401e237e7b3 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Wed, 23 Jul 2025 17:21:56 +0300 Subject: [PATCH] Fixed segfault that occurs when undoing while drawing --- src/DrawingProgram/BrushTool.cpp | 5 ++--- src/DrawingProgram/EditTool.cpp | 2 +- src/DrawingProgram/EllipseDrawTool.cpp | 4 ++-- src/DrawingProgram/RectDrawTool.cpp | 4 ++-- src/DrawingProgram/TextBoxTool.cpp | 5 ++--- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/DrawingProgram/BrushTool.cpp b/src/DrawingProgram/BrushTool.cpp index 97b3b7c..4ab8bf5 100644 --- a/src/DrawingProgram/BrushTool.cpp +++ b/src/DrawingProgram/BrushTool.cpp @@ -16,7 +16,6 @@ BrushTool::BrushTool(DrawingProgram& initDrawP): drawP(initDrawP) { - controls.intermediateItem = std::make_shared(); } void BrushTool::reset_tool() { @@ -172,13 +171,13 @@ void BrushTool::gui_toolbox() { } void BrushTool::commit_stroke() { - if(controls.intermediateItem) { + if(controls.intermediateItem && controls.intermediateItem->collabListInfo.lock()) { if(!controls.intermediateItem->d.points.empty()) { controls.intermediateItem->client_send_update_final(drawP); controls.intermediateItem->final_update(drawP); - controls.intermediateItem = nullptr; } } + controls.intermediateItem = nullptr; } void BrushTool::draw(SkCanvas* canvas, const DrawData& drawData) { diff --git a/src/DrawingProgram/EditTool.cpp b/src/DrawingProgram/EditTool.cpp index 443f3d7..f6cccf3 100644 --- a/src/DrawingProgram/EditTool.cpp +++ b/src/DrawingProgram/EditTool.cpp @@ -66,7 +66,7 @@ void EditTool::add_point_handle(const HandleData& handle) { void EditTool::reset_tool() { auto a = controls.compToEdit.lock(); - if(a) { + if(a && a->collabListInfo.lock()) { switch(a->get_type()) { case DRAWCOMPONENT_TEXTBOX: drawP.textBoxTool.commit_edit_updates(std::static_pointer_cast(a), controls.prevData); diff --git a/src/DrawingProgram/EllipseDrawTool.cpp b/src/DrawingProgram/EllipseDrawTool.cpp index a72c4dd..9dadcd8 100644 --- a/src/DrawingProgram/EllipseDrawTool.cpp +++ b/src/DrawingProgram/EllipseDrawTool.cpp @@ -140,11 +140,11 @@ void EllipseDrawTool::tool_update() { } void EllipseDrawTool::commit() { - if(controls.intermediateItem) { + if(controls.intermediateItem && controls.intermediateItem->collabListInfo.lock()) { controls.intermediateItem->client_send_update_final(drawP); controls.intermediateItem->final_update(drawP); - controls.intermediateItem = nullptr; } + controls.intermediateItem = nullptr; } void EllipseDrawTool::draw(SkCanvas* canvas, const DrawData& drawData) { diff --git a/src/DrawingProgram/RectDrawTool.cpp b/src/DrawingProgram/RectDrawTool.cpp index 01d2098..d1acdb3 100644 --- a/src/DrawingProgram/RectDrawTool.cpp +++ b/src/DrawingProgram/RectDrawTool.cpp @@ -140,11 +140,11 @@ void RectDrawTool::tool_update() { } void RectDrawTool::commit_rectangle() { - if(controls.intermediateItem) { + if(controls.intermediateItem && controls.intermediateItem->collabListInfo.lock()) { controls.intermediateItem->client_send_update_final(drawP); controls.intermediateItem->final_update(drawP); - controls.intermediateItem = nullptr; } + controls.intermediateItem = nullptr; } void RectDrawTool::draw(SkCanvas* canvas, const DrawData& drawData) { diff --git a/src/DrawingProgram/TextBoxTool.cpp b/src/DrawingProgram/TextBoxTool.cpp index fe7a11d..87ef56a 100644 --- a/src/DrawingProgram/TextBoxTool.cpp +++ b/src/DrawingProgram/TextBoxTool.cpp @@ -274,12 +274,11 @@ void TextBoxTool::update_textbox_network(const std::shared_ptr& tex } void TextBoxTool::commit() { - if(controls.intermediateItem) { + if(controls.intermediateItem && controls.intermediateItem->collabListInfo.lock()) { controls.intermediateItem->client_send_update_final(drawP); controls.intermediateItem->final_update(drawP); - //controls.intermediateItem->currentlyUpdating = true; // It remains true, as we are about to start writing into the text box we just placed - controls.intermediateItem = nullptr; } + controls.intermediateItem = nullptr; } void TextBoxTool::draw(SkCanvas* canvas, const DrawData& drawData) {