Prevent some issues with recursion on repeat-last-item

Fixes https://gitlab.com/kicad/code/kicad/-/issues/16168

(cherry picked from commit 90a61b8d36)
This commit is contained in:
Jon Evans 2023-11-26 16:43:06 -05:00
parent e6e08c111b
commit 0751a3ae7f
2 changed files with 26 additions and 0 deletions

View File

@ -698,6 +698,11 @@ void SCH_SHEET_LIST::BuildSheetList( SCH_SHEET* aSheet, bool aCheckIntegrity )
} }
else else
{ {
// If we are not performing a full recursion test, at least check if we are in
// a simple recursion scenario to prevent stack overflow crashes
wxCHECK2_MSG( sheet->GetFileName() != aSheet->GetFileName(), continue,
wxT( "Recursion prevented in SCH_SHEET_LIST::BuildSheetList" ) );
BuildSheetList( sheet, false ); BuildSheetList( sheet, false );
} }
} }

View File

@ -1119,7 +1119,28 @@ int SCH_EDIT_TOOL::RepeatDrawItem( const TOOL_EVENT& aEvent )
schIUScale.MilsToIU( cfg->m_Drawing.default_repeat_offset_y ) ) ); schIUScale.MilsToIU( cfg->m_Drawing.default_repeat_offset_y ) ) );
} }
// If cloning a sheet, check that we aren't going to create recursion
if( newItem->Type() == SCH_SHEET_T )
{
SCH_SHEET_PATH* currentSheet = &m_frame->GetCurrentSheet();
SCH_SHEET* sheet = static_cast<SCH_SHEET*>( newItem );
if( m_frame->CheckSheetForRecursion( sheet, currentSheet ) )
{
// Clear out the filename so that the user can pick a new one
sheet->SetFileName( wxEmptyString );
if( !m_frame->EditSheetProperties( sheet, currentSheet, nullptr ) )
{
// User canceled renaming the sheet; skip it
delete newItem;
continue;
}
}
}
m_toolMgr->RunAction( EE_ACTIONS::addItemToSel, true, newItem ); m_toolMgr->RunAction( EE_ACTIONS::addItemToSel, true, newItem );
newItem->SetFlags( IS_NEW ); newItem->SetFlags( IS_NEW );
m_frame->AddToScreen( newItem, m_frame->GetScreen() ); m_frame->AddToScreen( newItem, m_frame->GetScreen() );
m_frame->SaveCopyInUndoList( m_frame->GetScreen(), newItem, UNDO_REDO::NEWITEM, appendUndo ); m_frame->SaveCopyInUndoList( m_frame->GetScreen(), newItem, UNDO_REDO::NEWITEM, appendUndo );