From 14abc514edc0056169b9ab3a6ec9ab46fdce3f85 Mon Sep 17 00:00:00 2001
From: dpasukhi <dpasukhi@opencascade.com>
Date: Sun, 13 Sep 2020 21:13:49 +0300
Subject: [PATCH] 0031685: Data Exchange, STEPCAFControl_Reader - NULL
 dereference on translating PLACED_DATUM_TARGET_FEATURE

- Fix incorrect sharing DatumTargetType_Area
- Add check for null object
---
 src/STEPCAFControl/STEPCAFControl_Reader.cxx | 14 +++++--
 tests/bugs/step/bug31685_1                   | 44 ++++++++++++++++++++
 tests/bugs/step/bug31685_2                   | 44 ++++++++++++++++++++
 tests/bugs/step/bug31685_3                   | 44 ++++++++++++++++++++
 4 files changed, 142 insertions(+), 4 deletions(-)
 create mode 100644 tests/bugs/step/bug31685_1
 create mode 100644 tests/bugs/step/bug31685_2
 create mode 100644 tests/bugs/step/bug31685_3

diff --git a/src/STEPCAFControl/STEPCAFControl_Reader.cxx b/src/STEPCAFControl/STEPCAFControl_Reader.cxx
index 37fc818dda..eb88fd3f55 100644
--- a/src/STEPCAFControl/STEPCAFControl_Reader.cxx
+++ b/src/STEPCAFControl/STEPCAFControl_Reader.cxx
@@ -2400,7 +2400,10 @@ Standard_Boolean STEPCAFControl_Reader::setDatumToXCAF(const Handle(StepDimTol_D
     Handle(XCAFDimTolObjects_DatumObject) aDatTargetObj = new XCAFDimTolObjects_DatumObject();
     XCAFDimTolObjects_DatumTargetType aType;
     if (!STEPCAFControl_GDTProperty::GetDatumTargetType(aDT->Description(), aType))
+    {
+      aTP->AddWarning(aDT, "Unknown datum target type");
       continue;
+    }
     aDatTargetObj->SetDatumTargetType(aType);
     Standard_Boolean isValidDT = Standard_False;
 
@@ -2446,13 +2449,16 @@ Standard_Boolean STEPCAFControl_Reader::setDatumToXCAF(const Handle(StepDimTol_D
 
     if (aType == XCAFDimTolObjects_DatumTargetType_Area) {
       // Area datum target
-      Interface_EntityIterator anIterDTF = aGraph.Shareds(aDT);
+      if (aRelationship.IsNull())
+        continue;
+      Handle(StepRepr_ShapeAspect) aSA = aRelationship->RelatingShapeAspect();
+      Interface_EntityIterator aSAIter = aGraph.Sharings(aSA);
       Handle(StepAP242_GeometricItemSpecificUsage) aGISU;
-      for (; anIterDTF.More() && aGISU.IsNull(); anIterDTF.Next()) {
-        aGISU = Handle(StepAP242_GeometricItemSpecificUsage)::DownCast(anIterDTF.Value());
+      for (; aSAIter.More() && aGISU.IsNull(); aSAIter.Next()) {
+        aGISU = Handle(StepAP242_GeometricItemSpecificUsage)::DownCast(aSAIter.Value());
       }
       Handle(StepRepr_RepresentationItem) anItem;
-      if (aGISU->NbIdentifiedItem() > 0)
+      if (!aGISU.IsNull() && aGISU->NbIdentifiedItem() > 0)
         anItem = aGISU->IdentifiedItemValue(1);
       if (anItem.IsNull())
         continue;
diff --git a/tests/bugs/step/bug31685_1 b/tests/bugs/step/bug31685_1
new file mode 100644
index 0000000000..0b789b5804
--- /dev/null
+++ b/tests/bugs/step/bug31685_1
@@ -0,0 +1,44 @@
+puts "==================================================="
+puts " 0031685: Data Exchange, STEPCAFControl_Reader - NULL dereference on translating PLACED_DATUM_TARGET_FEATURE "
+puts "==================================================="
+puts ""
+
+pload DCAF
+
+# Read file
+ReadStep D [locate_data_file bug31685_1.stp]
+XGetOneShape res D
+
+# Checking
+checkshape res f
+set dump [XDumpNbDGTs D f]
+set info "
+
+ NbOfDimensions          : 14
+  NbOfDimensionalSize    : 7
+  NbOfDimensionalLocation: 0
+  NbOfAngular            : 0
+  NbOfWithPath           : 0
+  NbOfCommonLabels       : 0
+ NbOfTolerances          : 22
+  NbOfGTWithModifiers    : 4
+  NbOfGTWithMaxTolerance : 0
+  NbOfGTWithDatums       : 20
+ NbOfDatumFeature        : 13
+ NbOfAttachedDatum       : 70
+ NbOfDatumTarget         : 57
+"
+set isOK 1;
+set nb_ref [llength $dump]
+for { set i 0 } { $i < $nb_ref } { incr i } {
+  set refstr [lindex $info $i]
+  set curstr [lindex $dump $i]
+  if {[string equal $refstr $curstr] == 0} {
+    set isOK 0
+  }
+}
+if {$isOK == 0} {
+  puts "Error: wrong translate DGT"
+}
+
+Close D
\ No newline at end of file
diff --git a/tests/bugs/step/bug31685_2 b/tests/bugs/step/bug31685_2
new file mode 100644
index 0000000000..a36efa93c1
--- /dev/null
+++ b/tests/bugs/step/bug31685_2
@@ -0,0 +1,44 @@
+puts "==================================================="
+puts " 0031685: Data Exchange, STEPCAFControl_Reader - NULL dereference on translating PLACED_DATUM_TARGET_FEATURE "
+puts "==================================================="
+puts ""
+
+pload DCAF
+
+# Read file
+ReadStep D [locate_data_file bug31685_2.stp] 
+XGetOneShape res D
+
+# Checking
+checkshape res f
+set dump [XDumpNbDGTs D f]
+set info "
+
+ NbOfDimensions          : 52
+  NbOfDimensionalSize    : 17
+  NbOfDimensionalLocation: 4
+  NbOfAngular            : 0
+  NbOfWithPath           : 0
+  NbOfCommonLabels       : 1
+ NbOfTolerances          : 26
+  NbOfGTWithModifiers    : 3
+  NbOfGTWithMaxTolerance : 0
+  NbOfGTWithDatums       : 23
+ NbOfDatumFeature        : 16
+ NbOfAttachedDatum       : 72
+ NbOfDatumTarget         : 1
+"
+set isOK 1;
+set nb_ref [llength $dump]
+for { set i 0 } { $i < $nb_ref } { incr i } {
+  set refstr [lindex $info $i]
+  set curstr [lindex $dump $i]
+  if {[string equal $refstr $curstr] == 0} {
+    set isOK 0
+  }
+}
+if {$isOK == 0} {
+  puts "Error: wrong translate DGT"
+}
+
+Close D
\ No newline at end of file
diff --git a/tests/bugs/step/bug31685_3 b/tests/bugs/step/bug31685_3
new file mode 100644
index 0000000000..97ed381c8f
--- /dev/null
+++ b/tests/bugs/step/bug31685_3
@@ -0,0 +1,44 @@
+puts "==================================================="
+puts " 0031685: Data Exchange, STEPCAFControl_Reader - NULL dereference on translating PLACED_DATUM_TARGET_FEATURE "
+puts "==================================================="
+puts ""
+
+pload DCAF
+
+# Read file
+ReadStep D [locate_data_file bug31685_3.stp] 
+XGetOneShape res D
+
+# Checking
+checkshape res f
+set dump [XDumpNbDGTs D f]
+set info "
+
+ NbOfDimensions          : 60
+  NbOfDimensionalSize    : 20
+  NbOfDimensionalLocation: 2
+  NbOfAngular            : 0
+  NbOfWithPath           : 0
+  NbOfCommonLabels       : 1
+ NbOfTolerances          : 38
+  NbOfGTWithModifiers    : 3
+  NbOfGTWithMaxTolerance : 0
+  NbOfGTWithDatums       : 35
+ NbOfDatumFeature        : 15
+ NbOfAttachedDatum       : 109
+ NbOfDatumTarget         : 4
+"
+set isOK 1;
+set nb_ref [llength $dump]
+for { set i 0 } { $i < $nb_ref } { incr i } {
+  set refstr [lindex $info $i]
+  set curstr [lindex $dump $i]
+  if {[string equal $refstr $curstr] == 0} {
+    set isOK 0
+  }
+}
+if {$isOK == 0} {
+  puts "Error: wrong translate DGT"
+}
+
+Close D
\ No newline at end of file