kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #14261
Re: wxString conversion issues in pcbnew/netlist.cpp [PATCH]
On Wed, 2014-08-13 at 10:47 +0200, jp charras wrote:
> Le 13/08/2014 08:52, Andrew Zonenberg a écrit :
> > I was investigating some memory corruption segfaults with Valgrind and
> > found that the netlist-import code in pcbnew is calling
> > wxString::Printf() with a char* using the %s format specifier.
> >
> > While this may look right, the _() macro (through many levels of
> > indirection) converts %s to %ls, which expects a wide character string.
> >
> > The end result is that wcslen() gets called with a char* string, fails
> > to stop at the 1-byte null character, and keeps on reading off the end
> > causing garbage to be strewn through memory and sometimes crash pcbnew.
> > This can be fixed by forcibly converting the incoming UTF-8 string to
> > wchar_t* before passing it to wxString::Printf().
> >
> > The attached patch was tested on wx 2.8 on Debian 7 64-bit. I'm not sure
> > if it breaks anything on Windows or wx 3.0 so please test carefully :)
>
>
> Thanks, Andrew.
>
> wxString( fpOnBoard->GetFPID().GetFootprintName() ).GetData()
>
> instead of
> wxString( fpOnBoard->GetFPID().GetFootprintName() ).wc_str()
>
> could be a better fix for this issue.
>
>
Updated patch, attached, confirmed for working without any errors on my
machine. Anybody want to test on Windows or wx3.0?
--
Andrew Zonenberg
PhD student, security group
Computer Science Department
Rensselaer Polytechnic Institute
http://colossus.cs.rpi.edu/~azonenberg/
=== modified file 'pcbnew/netlist.cpp'
--- pcbnew/netlist.cpp 2014-06-05 07:54:47 +0000
+++ pcbnew/netlist.cpp 2014-08-13 12:20:51 +0000
@@ -242,8 +242,8 @@
{
msg.Printf( _( "* Warning: component '%s' has footprint '%s' and should be '%s'\n" ),
GetChars( component->GetReference() ),
- fpOnBoard->GetFPID().GetFootprintName().c_str(),
- component->GetFPID().GetFootprintName().c_str() );
+ wxString( fpOnBoard->GetFPID().GetFootprintName() ).GetData(),
+ wxString( component->GetFPID().GetFootprintName() ).GetData() );
aReporter->Report( msg );
}
@@ -272,7 +272,7 @@
msg.Printf( _( "*** Warning: Component '%s' footprint ID '%s' is not "
"valid. ***\n" ),
GetChars( component->GetReference() ),
- component->GetFPID().GetFootprintName().c_str() );
+ wxString( component->GetFPID().GetFootprintName() ).GetData() );
aReporter->Report( msg );
}
@@ -294,7 +294,7 @@
msg.Printf( _( "*** Warning: component '%s' footprint '%s' was not found in "
"any libraries in the footprint library table. ***\n" ),
GetChars( component->GetReference() ),
- component->GetFPID().GetFootprintName().c_str() );
+ wxString( component->GetFPID().GetFootprintName() ).GetData() );
aReporter->Report( msg );
}
Attachment:
signature.asc
Description: This is a digitally signed message part
Follow ups
References