Fix bug in legacy schematic I/O plugin.

Move adding LIB_PART to library until the part is fully parse.  The problem
was unique_ptr was cleaning up the part when an exception was thrown during
parsing causing a double free when the cache was deleted.

Add missing try/catch block when loading the cache library during an append
schematic operation.

Fixes lp:1663869

https://bugs.launchpad.net/kicad/+bug/1663869
This commit is contained in:
Wayne Stambaugh 2017-02-11 20:14:45 -05:00
parent eb06b35852
commit e8cf4f0724
3 changed files with 17 additions and 7 deletions

View File

@ -548,7 +548,8 @@ const wxString PART_LIBS::CacheName( const wxString& aFullProjectFilename )
} }
void PART_LIBS::LoadAllLibraries( PROJECT* aProject, bool aShowProgress ) throw( IO_ERROR, boost::bad_pointer ) void PART_LIBS::LoadAllLibraries( PROJECT* aProject, bool aShowProgress )
throw( IO_ERROR, boost::bad_pointer )
{ {
wxString filename; wxString filename;
wxString libs_not_found; wxString libs_not_found;

View File

@ -397,8 +397,15 @@ bool SCH_EDIT_FRAME::AppendOneEEProject()
{ {
PART_LIBS* libs = Prj().SchLibs(); PART_LIBS* libs = Prj().SchLibs();
if( PART_LIB* lib = libs->AddLibrary( cache_name ) ) try
lib->SetCache(); {
if( PART_LIB* lib = libs->AddLibrary( cache_name ) )
lib->SetCache();
}
catch( const IO_ERROR& ioe )
{
DisplayError( this, ioe.What() );
}
} }
wxLogDebug( wxT( "Importing schematic " ) + fullFileName ); wxLogDebug( wxT( "Importing schematic " ) + fullFileName );

View File

@ -2382,10 +2382,6 @@ LIB_PART* SCH_LEGACY_PLUGIN_CACHE::loadPart( FILE_LINE_READER& aReader )
value.SetVisible( false ); value.SetVisible( false );
} }
// Add the root alias to the alias list.
part->m_aliases.push_back( new LIB_ALIAS( name, part.get() ) );
m_aliases[ part->GetName() ] = part->GetAlias( name );
LIB_FIELD& reference = part->GetReferenceField(); LIB_FIELD& reference = part->GetReferenceField();
if( prefix == "~" ) if( prefix == "~" )
@ -2450,7 +2446,13 @@ LIB_PART* SCH_LEGACY_PLUGIN_CACHE::loadPart( FILE_LINE_READER& aReader )
else if( strCompare( "$FPLIST", line, &line ) ) // Footprint filter list else if( strCompare( "$FPLIST", line, &line ) ) // Footprint filter list
loadFootprintFilters( part, aReader ); loadFootprintFilters( part, aReader );
else if( strCompare( "ENDDEF", line, &line ) ) // End of part description else if( strCompare( "ENDDEF", line, &line ) ) // End of part description
{
// Add the root alias to the alias list.
part->m_aliases.push_back( new LIB_ALIAS( name, part.get() ) );
m_aliases[ part->GetName() ] = part->GetAlias( name );
return part.release(); return part.release();
}
line = aReader.ReadLine(); line = aReader.ReadLine();
} }