mirror of
https://github.com/Open-Cascade-SAS/OCCT.git
synced 2026-06-10 16:16:54 +08:00
0031292: Data Exchange - SIGSEGV on reading STEP file with references to invalid entities
Changes: - in StepData_StepReaderData::ReadEntity, make sure that entity handle is not null before calling IsKind() of it. - in StepData_StepReaderData::SetEntityNumbers, do not invert the sign of entity number of referenced parameter if the second pass is not required. Otherwise, the number -1 (obviously invalid) becomes 1 (invalid, but not obviously) without further correction of it. - in StepData_UndefinedEntity::ReadRecord, consider the case when the entity number is positive but refers to non-existing entity. In this case literal value will be used instead of null entity for the problematic parameter.
This commit is contained in:
@@ -1038,7 +1038,7 @@ Standard_Boolean StepData_StepReaderData::ReadEntity(const Standard_Integer num,
|
||||
if (entent.IsNull() || !entent->IsKind(atype))
|
||||
{
|
||||
errmess = new String("Parameter n0.%d (%s) : Entity has illegal type");
|
||||
if (entent->IsKind(STANDARD_TYPE(StepData_UndefinedEntity)))
|
||||
if (!entent.IsNull() && entent->IsKind(STANDARD_TYPE(StepData_UndefinedEntity)))
|
||||
ent = entent;
|
||||
}
|
||||
else ent = entent;
|
||||
@@ -1087,7 +1087,7 @@ Standard_Boolean StepData_StepReaderData::ReadEntity(const Standard_Integer num,
|
||||
{
|
||||
errmess = new String("Parameter n0.%d (%s) : Entity has illegal type");
|
||||
//fot not suppported STEP entity
|
||||
if (entent->IsKind(STANDARD_TYPE(StepData_UndefinedEntity)))
|
||||
if (!entent.IsNull() && entent->IsKind(STANDARD_TYPE(StepData_UndefinedEntity)))
|
||||
sel.SetValue(entent);
|
||||
}
|
||||
else
|
||||
@@ -1583,8 +1583,10 @@ void StepData_StepReaderData::SetEntityNumbers(const Standard_Boolean withmap)
|
||||
if (num0 > 0) FP.SetEntityNumber(num0); // ET VOILA, on a resolu
|
||||
else FP.SetEntityNumber(-id); // CONFLIT -> faudra resoudre ...
|
||||
} else { // NON RESOLU, si pas pbmap, le dire
|
||||
FP.SetEntityNumber(-id);
|
||||
if (pbmap) continue; // pbmap : on se retrouvera
|
||||
if (pbmap) {
|
||||
FP.SetEntityNumber(-id);
|
||||
continue; // pbmap : on se retrouvera
|
||||
}
|
||||
char failmess[100];
|
||||
// ... Construire le Check ...
|
||||
sprintf(failmess,
|
||||
|
||||
Reference in New Issue
Block a user