From: msv Date: Fri, 10 Jan 2020 17:59:51 +0000 (+0300) Subject: 0031292: Data Exchange - SIGSEGV on reading STEP file with references to invalid... X-Git-Tag: V7_5_0_beta~306 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=ef59b5e064913bd32e4a2b66a002cbcae7fa90a4 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. --- diff --git a/src/StepData/StepData_StepReaderData.cxx b/src/StepData/StepData_StepReaderData.cxx index 3c64208060..69bcda5903 100644 --- a/src/StepData/StepData_StepReaderData.cxx +++ b/src/StepData/StepData_StepReaderData.cxx @@ -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, diff --git a/src/StepData/StepData_UndefinedEntity.cxx b/src/StepData/StepData_UndefinedEntity.cxx index 87765da9f0..48b8670b51 100644 --- a/src/StepData/StepData_UndefinedEntity.cxx +++ b/src/StepData/StepData_UndefinedEntity.cxx @@ -67,13 +67,16 @@ void StepData_UndefinedEntity::ReadRecord(const Handle(StepData_StepReaderData)& Standard_Integer nume = 0; if (partyp == Interface_ParamIdent) { nume = SR->ParamNumber(num,i); + if (nume > 0) { + anent = SR->BoundEntity(nume); + if (anent.IsNull()) { + nume = 0; + } + } if (nume <= 0) { ach->AddFail("A reference to another entity is unresolved"); partyp = Interface_ParamVoid; } - else { - anent = SR->BoundEntity(nume); - } } else if (partyp == Interface_ParamSub) { nume = SR->ParamNumber(num,i); diff --git a/tests/bugs/step/bug31292 b/tests/bugs/step/bug31292 new file mode 100644 index 0000000000..db4112246d --- /dev/null +++ b/tests/bugs/step/bug31292 @@ -0,0 +1,10 @@ +puts "========================" +puts "0031292: Data Exchange - SIGSEGV on reading STEP file with references to invalid entities" +puts "========================" + +stepread [locate_data_file bug31292.stp] a * +renamevar a_1 result + +checkshape result + +checkview -display result -2d -path ${imagedir}/${test_image}.png