From 6c30e4f90b8fb1d5ef38629a051106bb6f5e13c0 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Mon, 28 Apr 2025 17:39:53 +0200 Subject: [PATCH] Gerbview: fix a maximum number (50) of Error messages in report list. Having a lot of errors can happen when trying to open a non gerber files (this is easy when loading a zip archive). With a *lot* of errors (if a large .step file is found) Gerbview can hang. Fixes https://gitlab.com/kicad/code/kicad/-/issues/20799 (cherry picked from commit d5cf54197468a825ba8cf09b46d228d9f425f7d1) --- gerbview/gerber_file_image.cpp | 14 ++++++++++++++ gerbview/gerber_file_image.h | 5 +---- gerbview/readgerb.cpp | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/gerbview/gerber_file_image.cpp b/gerbview/gerber_file_image.cpp index a5e6b1be0d..020544da91 100644 --- a/gerbview/gerber_file_image.cpp +++ b/gerbview/gerber_file_image.cpp @@ -112,6 +112,20 @@ GERBER_FILE_IMAGE::~GERBER_FILE_IMAGE() } +void GERBER_FILE_IMAGE::AddMessageToList( const wxString& aMessage ) +{ + /* Add a message to the message list, but only if there are less than max_messages + * to avoid very long list (can happens if trying to read a non gerber file) + */ + const int max_messages = 50; // Arbitrary but reasonable value. + + if( m_messagesList.size() < max_messages ) + m_messagesList.Add( aMessage ); + else if( m_messagesList.size() == max_messages ) + m_messagesList.Add( _( "Too many messages, some are skipped" ) ); +} + + void GERBER_FILE_IMAGE::SetDrawOffetAndRotation( VECTOR2D aOffsetMM, EDA_ANGLE aRotation ) { m_DisplayOffset.x = KiROUND( aOffsetMM.x * gerbIUScale.IU_PER_MM ); diff --git a/gerbview/gerber_file_image.h b/gerbview/gerber_file_image.h index 3e87fbdfe1..0c86ff0867 100644 --- a/gerbview/gerber_file_image.h +++ b/gerbview/gerber_file_image.h @@ -212,10 +212,7 @@ public: /** * Add a message to the message list */ - void AddMessageToList( const wxString& aMessage ) - { - m_messagesList.Add( aMessage ); - } + void AddMessageToList( const wxString& aMessage ); /** * Return the current coordinate type pointed to by XnnYnn Text (XnnnnYmmmm). diff --git a/gerbview/readgerb.cpp b/gerbview/readgerb.cpp index dc8c05026f..f44f2a0537 100644 --- a/gerbview/readgerb.cpp +++ b/gerbview/readgerb.cpp @@ -323,7 +323,7 @@ bool GERBER_FILE_IMAGE::LoadGerberFile( const wxString& aFullFileName ) break; default: - msg.Printf( wxT( "Unexpected char 0x%2.2X" ), *text ); + msg.Printf( wxT( "Unexpected char 0x%2.2X (%c)" ), *text, *text ); AddMessageToList( msg ); text++; break;