From af131bd03ea615d8ff6a017f13a1c7aae1d3c825 Mon Sep 17 00:00:00 2001 From: snn Date: Thu, 25 May 2017 14:28:43 +0300 Subject: [PATCH] refs #369: Crash deleting thread of notes * XCAFDoc_NotesTool, incorrect removing parent/child from XCAFDoc_GraphNode attribute in loops --- src/XCAFDoc/XCAFDoc_NotesTool.cxx | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/XCAFDoc/XCAFDoc_NotesTool.cxx b/src/XCAFDoc/XCAFDoc_NotesTool.cxx index 89f761c1f4..3a511bceff 100644 --- a/src/XCAFDoc/XCAFDoc_NotesTool.cxx +++ b/src/XCAFDoc/XCAFDoc_NotesTool.cxx @@ -522,10 +522,9 @@ XCAFDoc_NotesTool::RemoveAllNotes(const XCAFDoc_AssemblyItemId& theItemId, if (!anAnnotatedItem.FindAttribute(XCAFDoc::NoteRefGUID(), aChild)) return Standard_False; - Standard_Integer nbFathers = aChild->NbFathers(); - for (Standard_Integer iFather = 1; iFather <= nbFathers; ++iFather) + while (aChild->NbFathers() > 0) { - Handle(XCAFDoc_GraphNode) aFather = aChild->GetFather(iFather); + Handle(XCAFDoc_GraphNode) aFather = aChild->GetFather(1); Handle(XCAFDoc_Note) aNote = XCAFDoc_Note::Get(aFather->Label()); if (!aNote.IsNull()) { @@ -553,10 +552,9 @@ XCAFDoc_NotesTool::RemoveAllSubshapeNotes(const XCAFDoc_AssemblyItemId& theItemI if (!anAnnotatedItem.FindAttribute(XCAFDoc::NoteRefGUID(), aChild)) return Standard_False; - Standard_Integer nbFathers = aChild->NbFathers(); - for (Standard_Integer iFather = 1; iFather <= nbFathers; ++iFather) + while (aChild->NbFathers() > 0) { - Handle(XCAFDoc_GraphNode) aFather = aChild->GetFather(iFather); + Handle(XCAFDoc_GraphNode) aFather = aChild->GetFather(1); Handle(XCAFDoc_Note) aNote = XCAFDoc_Note::Get(aFather->Label()); if (!aNote.IsNull()) { @@ -584,10 +582,9 @@ XCAFDoc_NotesTool::RemoveAllAttrNotes(const XCAFDoc_AssemblyItemId& theItemId, if (!anAnnotatedItem.FindAttribute(XCAFDoc::NoteRefGUID(), aChild)) return Standard_False; - Standard_Integer nbFathers = aChild->NbFathers(); - for (Standard_Integer iFather = 1; iFather <= nbFathers; ++iFather) + while (aChild->NbFathers()) { - Handle(XCAFDoc_GraphNode) aFather = aChild->GetFather(iFather); + Handle(XCAFDoc_GraphNode) aFather = aChild->GetFather(1); Handle(XCAFDoc_Note) aNote = XCAFDoc_Note::Get(aFather->Label()); if (!aNote.IsNull()) { @@ -611,11 +608,10 @@ XCAFDoc_NotesTool::DeleteNote(const TDF_Label& theNoteLabel) Handle(XCAFDoc_GraphNode) aFather; if (theNoteLabel.FindAttribute(XCAFDoc::NoteRefGUID(), aFather) && !aFather.IsNull()) { - Standard_Integer nbChildren = aFather->NbChildren(); - for (Standard_Integer iChild = 1; iChild <= nbChildren; ++iChild) + while (aFather->NbChildren() > 0) { - Handle(XCAFDoc_GraphNode) aChild = aFather->GetChild(iChild); - aFather->UnSetChild(iChild); + Handle(XCAFDoc_GraphNode) aChild = aFather->GetChild(1); + aFather->UnSetChild(aChild); if (aChild->NbFathers() == 0) aChild->Label().ForgetAttribute(aChild); }