0031292: Data Exchange - SIGSEGV on reading STEP file with references to invalid...
authormsv <msv@opencascade.com>
Fri, 10 Jan 2020 17:59:51 +0000 (20:59 +0300)
committerbugmaster <bugmaster@opencascade.com>
Mon, 13 Jan 2020 13:16:48 +0000 (16:16 +0300)
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.

src/StepData/StepData_StepReaderData.cxx
src/StepData/StepData_UndefinedEntity.cxx
tests/bugs/step/bug31292 [new file with mode: 0644]

index 3c64208..69bcda5 100644 (file)
@@ -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,
index 87765da..48b8670 100644 (file)
@@ -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 (file)
index 0000000..db41122
--- /dev/null
@@ -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