Package: opencascade-tools
Version: 6.2-7
Severity: normal
Tags: patch

Hi,

When splitting opencascade packages, I found that WOK generates broken
files.  Here is a test case against current git HEAD (OCC 6.3.0), I believe
that all OpenCascade versions are broken.
Attached patch fixes all issues, I will commit it shortly.

  $ cat test.tcl
package require Wok
package require Ms
package require Tclx

set savpwd [pwd]

set env(WOK_ROOTADMDIR) $savpwd/tmp/wok/wok_entities
mkdir $env(WOK_ROOTADMDIR)

source $savpwd/debian/wok_Init.tcl
source $savpwd/ros/src/WOKsite/CreateFactory.tcl

CreateFactory $env(WOK_ROOTADMDIR) OS OCC63 ros $savpwd/ros

wokcd Standard
umake -f -e xcpp.header
exit
  $ rm -rf tmp
  $ valgrind tclsh test.tcl
[...]
Info    : Step xcpp.src is successfull
=====> Standard:xcpp.header

Info    : Extracting Standard
==20196== Invalid read of size 4
==20196==    at 0x57868B3:
TCollection_AsciiString::TCollection_AsciiString(char const*) (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x578E060:
TCollection_HAsciiString::TCollection_HAsciiString(char const*) (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x52288C6: EDL_Variable::EDL_Variable(char const*,
char const*) (in /usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x5225EAB: EDL_Interpretor::AddVariable(char const*,
char const*) (in /usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x52210D1: EDL_API::AddVariable(char const*, char
const*) const (in /usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x63E1E2F: CPP_BuildMethod(Handle_MS_MetaSchema
const&, Handle_EDL_API const&, Handle_MS_Method const&,
Handle_TCollection_HAsciiString const&, unsigned) (in
/usr/lib/libTKCPPExt-6.3.0.so)
==20196==    by 0x63E788D: CPP_Package(Handle_MS_MetaSchema const&,
Handle_EDL_API const&, Handle_MS_Package const&,
Handle_TColStd_HSequenceOfHAsciiString const&) (in
/usr/lib/libTKCPPExt-6.3.0.so)
==20196==    by 0x63DE9F0: CPP_Extract (in /usr/lib/libTKCPPExt-6.3.0.so)
==20196==    by 0x52BEEDF:
WOKBuilder_MSExtractor::Extract(Handle_WOKBuilder_MSchema const&,
Handle_WOKBuilder_MSEntity const&) (in /usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x52BFF1C:
WOKBuilder_MSExtractorIterator::Execute(Handle_WOKBuilder_MSEntity
const&) (in /usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x53559E6:
WOKStep_Extract::Execute(Handle_WOKMake_HSequenceOfInputFile const&)
(in /usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x531DD19: WOKMake_Step::Make() (in /usr/lib/libTKWOK-6.3.0.so)
==20196==  Address 0x635a7e8 is 0 bytes inside a block of size 20 free'd
==20196==    at 0x4022B8A: free (vg_replace_malloc.c:323)
==20196==    by 0x5770623: Standard_MMgrRaw::Free(void*&) (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x576AA79: Standard::Free(void*&) (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x5788187: TCollection_AsciiString::Destroy() (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x578E742:
TCollection_HAsciiString::~TCollection_HAsciiString() (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x573D0B4: MMgt_TShared::Delete() const (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x576A4DD: Handle_Standard_Transient::EndScope() (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x63E1DFA: CPP_BuildMethod(Handle_MS_MetaSchema
const&, Handle_EDL_API const&, Handle_MS_Method const&,
Handle_TCollection_HAsciiString const&, unsigned) (in
/usr/lib/libTKCPPExt-6.3.0.so)
==20196==    by 0x63E788D: CPP_Package(Handle_MS_MetaSchema const&,
Handle_EDL_API const&, Handle_MS_Package const&,
Handle_TColStd_HSequenceOfHAsciiString const&) (in
/usr/lib/libTKCPPExt-6.3.0.so)
==20196==    by 0x63DE9F0: CPP_Extract (in /usr/lib/libTKCPPExt-6.3.0.so)
==20196==    by 0x52BEEDF:
WOKBuilder_MSExtractor::Extract(Handle_WOKBuilder_MSchema const&,
Handle_WOKBuilder_MSEntity const&) (in /usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x52BFF1C:
WOKBuilder_MSExtractorIterator::Execute(Handle_WOKBuilder_MSEntity
const&) (in /usr/lib/libTKWOK-6.3.0.so)
[...]
Info    : Step xcpp.header is successfull
Info    : ------------------ Process report ------------------
Info    : Success  Standard
Info    : ----------------------------------------------------
==20196==
==20196== Mismatched free() / delete / delete []
==20196==    at 0x402272A: operator delete(void*) (vg_replace_malloc.c:342)
==20196==    by 0x539EC2C: WOKUnix_Process::Destroy() (in
/usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x53A4A6C: WOKUnix_Shell::~WOKUnix_Shell() (in
/usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x573D0B4: MMgt_TShared::Delete() const (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x576A4DD: Handle_Standard_Transient::EndScope() (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x530F912:
WOKMake_BuildProcess::~WOKMake_BuildProcess() (in
/usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x573D0B4: MMgt_TShared::Delete() const (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x576A4DD: Handle_Standard_Transient::EndScope() (in
/usr/lib/libTKernel-6.3.0.so)
==20196==    by 0x527A4E2: WOKAPI_BuildProcess::~WOKAPI_BuildProcess()
(in /usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x5276682: WOKAPI_Command::UnitMake(WOKAPI_Session
const&, int, char** const&, WOKTools_Return&) (in /usr/lib/libTKWOK-
6.3.0.so)
==20196==    by 0x50DC9E7: DefaultCommand(void*, Tcl_Interp*, int,
char const**) (in /usr/lib/libTKWOKTcl-6.3.0.so)
==20196==    by 0x405F6AD: TclInvokeStringCommand (in /usr/lib/libtcl8.4.so.0)
==20196==  Address 0x43ec850 is 0 bytes inside a block of size 12 alloc'd
==20196==    at 0x402309E: operator new[](unsigned) (vg_replace_malloc.c:268)
==20196==    by 0x539F558: WOKUnix_Process::WOKUnix_Process(int,
char** const&, WOKUnix_PopenOutputMode, WOKUnix_PopenBufferMode, int)
(in /usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x53A4715:
WOKUnix_Shell::WOKUnix_Shell(WOKUnix_ShellMode,
WOKUnix_PopenOutputMode, WOKUnix_PopenBufferMode) (in /usr/l
ib/libTKWOK-6.3.0.so)
==20196==    by 0x53A5210: WOKUnix_ShellManager::GetShell() (in
/usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x53BCDAA:
WOKernel_Entity::Build(Handle_WOKUtils_HSequenceOfParamItem const&)
(in /usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x528752D: WOKAPI_Entity::BuildEntity(WOKAPI_Session
const&, Handle_TCollection_HAsciiString const&, WOKAPI_Entity cons
t&, Handle_WOKTools_HSequenceOfDefine const&, unsigned, unsigned) (in
/usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x528AD55: WOKAPI_Factory::Build(WOKAPI_Session
const&, Handle_TCollection_HAsciiString const&,
Handle_WOKTools_HSequen
ceOfDefine const&, unsigned) (in /usr/lib/libTKWOK-6.3.0.so)
==20196==    by 0x526FD97:
WOKAPI_Command::FactoryCreate(WOKAPI_Session const&, int, char**
const&, WOKTools_Return&) (in /usr/lib/libT
KWOK-6.3.0.so)
==20196==    by 0x50DC9E7: DefaultCommand(void*, Tcl_Interp*, int,
char const**) (in /usr/lib/libTKWOKTcl-6.3.0.so)
==20196==    by 0x405F6AD: TclInvokeStringCommand (in /usr/lib/libtcl8.4.so.0)
==20196==    by 0x4060925: TclEvalObjvInternal (in /usr/lib/libtcl8.4.so.0)
==20196==    by 0x408A7CE: (within /usr/lib/libtcl8.4.so.0)
Fix WOKStep_Extract::Execute

This step did put garbage into generated file, because a pointer was used
after it has been freed.

diff --git a/ros/src/CPPExt/CPPExt.cxx b/ros/src/CPPExt/CPPExt.cxx
index 4d96c47..a651607 100644
--- a/ros/src/CPPExt/CPPExt.cxx
+++ b/ros/src/CPPExt/CPPExt.cxx
@@ -397,7 +397,8 @@ void CPP_BuildMethod(const Handle(MS_MetaSchema)& aMeta,
     const Handle(TCollection_HAsciiString)& aTypeName=retType->TypeName();
     pTypeName=(char *)aTypeName->ToCString();
     //
-    pTypeRet=(char *)CPP_BuildType(aMeta,aTypeName)->ToCString();
+    const Handle(TCollection_HAsciiString)& aTypeRet=CPP_BuildType(aMeta,aTypeName);
+    pTypeRet=(char *)aTypeRet->ToCString();
     //
     //modified by NIZNHY-PKV Mon May  5 15:10:12 2008f
     if (m->IsPtrReturn()) {
diff --git a/ros/src/WOKUnix/WOKUnix_Process.cxx b/ros/src/WOKUnix/WOKUnix_Process.cxx
index dd6caf6..fa649c7 100644
--- a/ros/src/WOKUnix/WOKUnix_Process.cxx
+++ b/ros/src/WOKUnix/WOKUnix_Process.cxx
@@ -373,6 +373,6 @@ void WOKUnix_Process::Kill()
 void WOKUnix_Process::Destroy()
 {
  Kill();
- delete myargv;
+ delete [] myargv;
 }
 #endif

Reply via email to