From 1eaf89b485319b5e751de06647f48c03f8d6ad59 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 26 Jun 2024 11:30:10 +0200 Subject: [PATCH] Sketcher: Handle PyException in createGeneratedAutoConstraints Command::doCommand may throw an exception that isn't handled by the active sketch handler. This may leave it in an inconsistent state and can cause a crash later. See #14945 --- .../Sketcher/Gui/DrawSketchDefaultHandler.h | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/Mod/Sketcher/Gui/DrawSketchDefaultHandler.h b/src/Mod/Sketcher/Gui/DrawSketchDefaultHandler.h index a0eec677a6..52cc2d77a7 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchDefaultHandler.h +++ b/src/Mod/Sketcher/Gui/DrawSketchDefaultHandler.h @@ -859,11 +859,29 @@ protected: * all the constraints stored in the AutoConstraints vector. */ void createGeneratedAutoConstraints(bool owncommand) { - // add auto-constraints - if (owncommand) { - Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Add auto constraints")); - } + try { + // add auto-constraints + if (owncommand) { + Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Add auto constraints")); + } + tryAddAutoConstraints(); + + if (owncommand) { + Gui::Command::commitCommand(); + } + } + catch (const Base::PyException&) { + if (owncommand) { + Gui::Command::abortCommand(); + } + } + } + + /** @brief Convenience function to automatically add to the SketchObjects + * all the constraints stored in the AutoConstraints vector. */ + void tryAddAutoConstraints() + { auto autoConstraints = toPointerVector(AutoConstraints); Gui::Command::doCommand( @@ -871,10 +889,6 @@ protected: Sketcher::PythonConverter::convert(Gui::Command::getObjectCmd(sketchgui->getObject()), autoConstraints) .c_str()); - - if (owncommand) { - Gui::Command::commitCommand(); - } } /** @brief Convenience function to remove redundant autoconstraints from the AutoConstraints