Skip to content

Commit 345caa8

Browse files
committed
fix segfault exposed by lazy loading complex instances
1 parent b8ae949 commit 345caa8

5 files changed

Lines changed: 23 additions & 20 deletions

File tree

src/cllazyfile/sectionReader.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ instanceID sectionReader::readInstanceNumber() {
219219
SDAI_Application_instance * sectionReader::getRealInstance( const Registry * reg, long int begin, instanceID instance,
220220
const std::string & typeName, const std::string & schName, bool header ) {
221221
char c;
222-
const char * tName = 0, * sName = 0;
222+
const char * tName = 0, * sName = 0; //these are necessary since typeName and schName are const
223223
std::string comment;
224224
Severity sev;
225225
SDAI_Application_instance * inst = 0;
@@ -277,7 +277,7 @@ SDAI_Application_instance * sectionReader::getRealInstance( const Registry * reg
277277
findNormalString( "(" );
278278
_file.unget();
279279
//TODO do something with 'sev'
280-
sev = inst->STEPread( instance, 0, _lazyFile->getInstMgr()->getAdapter(), _file, schName.c_str(), true, false );
280+
sev = inst->STEPread( instance, 0, _lazyFile->getInstMgr()->getAdapter(), _file, sName, true, false );
281281
return inst;
282282
}
283283

src/clstepcore/STEPcomplex.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ Severity STEPcomplex::STEPread( int id, int addFileId, class InstMgr * instance_
305305
"Missing open paren before entity attr values.\n" );
306306
cout << "ERROR: missing open paren\n";
307307
_error.GreaterSeverity( SEVERITY_INPUT_ERROR );
308-
STEPread_error( c, 0, in );
308+
STEPread_error( c, 0, in, currSch );
309309
return _error.severity();
310310
}
311311

@@ -320,7 +320,7 @@ Severity STEPcomplex::STEPread( int id, int addFileId, class InstMgr * instance_
320320
_error.AppendToDetailMsg(
321321
"Complex entity part of instance does not exist.\n" );
322322
_error.GreaterSeverity( SEVERITY_INPUT_ERROR );
323-
STEPread_error( c, 0, in );
323+
STEPread_error( c, 0, in, currSch );
324324
return _error.severity();
325325
}
326326
in >> ws;
@@ -371,7 +371,7 @@ Severity STEPcomplex::STEPread( int id, int addFileId, class InstMgr * instance_
371371
"Missing open paren before entity attr values.\n" );
372372
cout << "ERROR: missing open paren\n";
373373
_error.GreaterSeverity( SEVERITY_INPUT_ERROR );
374-
STEPread_error( c, 0, in );
374+
STEPread_error( c, 0, in, currSch );
375375
return _error.severity();
376376
} else { // c == '('
377377
in.putback( c );
@@ -399,7 +399,7 @@ Severity STEPcomplex::STEPread( int id, int addFileId, class InstMgr * instance_
399399
"Missing open paren before entity attr values.\n" );
400400
cout << "ERROR: missing open paren\n";
401401
_error.GreaterSeverity( SEVERITY_INPUT_ERROR );
402-
STEPread_error( c, 0, in );
402+
STEPread_error( c, 0, in, currSch );
403403
return _error.severity();
404404
} else { // c == '('
405405
in.putback( c );
@@ -543,7 +543,8 @@ void STEPcomplex::BuildAttrs( const char * s ) {
543543
}
544544
}
545545

546-
void STEPcomplex::STEPread_error( char c, int index, istream & in ) {
546+
void STEPcomplex::STEPread_error( char c, int index, istream & in, const char * schnm ) {
547+
(void) schnm; //unused
547548
cout << "STEPcomplex::STEPread_error(), index=" << index << ", entity #" << STEPfile_id << "." << endl;
548549
streampos p = in.tellg();
549550
std::string q, r;

src/clstepcore/STEPcomplex.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class SC_CORE_EXPORT STEPcomplex : public SDAI_Application_instance {
4242
istream & in = cin, const char * currSch = NULL,
4343
bool useTechCor = true, bool strict = true );
4444

45-
virtual void STEPread_error( char c, int index, istream & in );
45+
virtual void STEPread_error( char c, int index, istream& in, const char * schnm );
4646

4747
// WRITE
4848
virtual void STEPwrite( ostream & out = cout, const char * currSch = NULL,

src/clstepcore/sdaiApplication_instance.cc

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -411,12 +411,13 @@ void SDAI_Application_instance::PrependEntityErrMsg() {
411411
/**************************************************************//**
412412
** \param c -- character which caused error
413413
** \param i -- index of attribute which caused error
414-
** \param in -- input stream for recovery
415-
** \details reports the error found, reads until it finds the end of an
416-
** instance. i.e. a close quote followed by a semicolon optionally having
417-
** whitespace between them.
414+
** \param in -- (used in STEPcomplex) input stream for recovery
415+
** Reports the error found, reads until it finds the end of an
416+
** instance. i.e. a close quote followed by a semicolon optionally
417+
** having whitespace between them.
418418
******************************************************************/
419-
void SDAI_Application_instance::STEPread_error( char c, int i, istream & in ) {
419+
void SDAI_Application_instance::STEPread_error( char c, int i, istream & in, const char * schnm ) {
420+
(void) in;
420421
char errStr[BUFSIZ];
421422
errStr[0] = '\0';
422423

@@ -438,11 +439,12 @@ void SDAI_Application_instance::STEPread_error( char c, int i, istream & in ) {
438439
}
439440

440441
std::string tmp;
441-
STEPwrite( tmp ); // STEPwrite writes to a static buffer inside function
442-
sprintf( errStr,
443-
" The invalid instance to this point looks like :\n%s\n",
444-
tmp.c_str() );
445-
_error.AppendToDetailMsg( errStr );
442+
STEPwrite( tmp, schnm ); // STEPwrite writes to a static buffer inside function
443+
_error.AppendToDetailMsg( " The invalid instance to this point looks like :\n" );
444+
_error.AppendToDetailMsg( tmp );
445+
_error.AppendToDetailMsg( "\nUnexpected character: " );
446+
_error.AppendToDetailMsg( c );
447+
_error.AppendToDetailMsg( '\n' );
446448

447449
sprintf( errStr, "\nfinished reading #%d\n", STEPfile_id );
448450
_error.AppendToDetailMsg( errStr );
@@ -584,7 +586,7 @@ Severity SDAI_Application_instance::STEPread( int id, int idIncr,
584586
return _error.severity();
585587
}
586588
}
587-
STEPread_error( c, i, in );
589+
STEPread_error( c, i, in, currSch );
588590
// code fragment imported from STEPread_error
589591
// for some currently unknown reason it was commented out of STEPread_error
590592
errStr[0] = '\0';

src/clstepcore/sdaiApplication_instance.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ class SC_CORE_EXPORT SDAI_Application_instance : public SDAI_DAObject_SDAI {
9898
class InstMgr * instance_set,
9999
istream & in = cin, const char * currSch = NULL,
100100
bool useTechCor = true, bool strict = true );
101-
virtual void STEPread_error( char c, int index, istream & in );
101+
virtual void STEPread_error( char c, int i, std::istream& in, const char * schnm );
102102

103103
// WRITE
104104
virtual void STEPwrite( ostream & out = cout, const char * currSch = NULL,

0 commit comments

Comments
 (0)