0031274: Data Exchange - RWObj_Reader ignores usemtl with empty name WEEK-52
authorkgv <kgv@opencascade.com>
Wed, 25 Dec 2019 16:36:48 +0000 (19:36 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 26 Dec 2019 14:19:31 +0000 (17:19 +0300)
Fixed out of range access within pushMaterial().

src/RWObj/RWObj_Reader.cxx
tests/de_mesh/obj_read/usemtl [new file with mode: 0644]

index 157d223..4e09d1b 100644 (file)
@@ -220,9 +220,9 @@ Standard_Boolean RWObj_Reader::read (const TCollection_AsciiString& theFile,
 
     if (theToProbe)
     {
-      if (::memcmp (aLine, "mtllib", 6) == 0)
+      if (::strncmp (aLine, "mtllib", 6) == 0)
       {
-        readMaterialLib (aLine + 7);
+        readMaterialLib (IsSpace (aLine[6]) ? aLine + 7 : "");
       }
       else if (aLine[0] == 'v' && RWObj_Tools::isSpaceChar (aLine[1]))
       {
@@ -269,13 +269,13 @@ Standard_Boolean RWObj_Reader::read (const TCollection_AsciiString& theFile,
     {
       pushObject (aLine + 2);
     }
-    else if (::memcmp (aLine, "mtllib", 6) == 0)
+    else if (::strncmp (aLine, "mtllib", 6) == 0)
     {
-      readMaterialLib (aLine + 7);
+      readMaterialLib (IsSpace (aLine[6]) ? aLine + 7 : "");
     }
-    else if (::memcmp (aLine, "usemtl", 6) == 0)
+    else if (::strncmp (aLine, "usemtl", 6) == 0)
     {
-      pushMaterial (aLine + 7);
+      pushMaterial (IsSpace (aLine[6]) ? aLine + 7 : "");
     }
 
     if (!checkMemory())
diff --git a/tests/de_mesh/obj_read/usemtl b/tests/de_mesh/obj_read/usemtl
new file mode 100644 (file)
index 0000000..98382f1
--- /dev/null
@@ -0,0 +1,55 @@
+puts "========"
+puts "0031274: Data Exchange - RWObj_Reader ignores usemtl with empty name"
+puts "========"
+
+set material_mtl {newmtl Red
+Kd 1.0 0.0 0.0
+newmtl Green
+Kd 0.0 1.0 0.0
+newmtl Blue
+Kd 0.0 0.0 1.0}
+
+set ml_obj {
+mtllib usemtl_material.mtl
+v 0 0 0
+v 2 0 0
+v 2 1 0
+v 1 2 0
+v 0 1 0
+v 0 0 2
+v 2 0 2
+v 2 1 2
+v 1 2 2
+v 0 1 2
+g Red
+usemtl Red
+f 5 4 3 2 1
+g Gren
+usemtl Green
+f 7 8 9 10 6
+g Blue
+usemtl Blue
+f 10 9 4 5
+g Gray
+usemtl
+f 9 8 3 4
+f 6 10 5 1
+f 2 3 8 7
+f 1 2 7 6}
+
+set fd [open ${imagedir}/${casename}_material.mtl w]
+fconfigure $fd -translation lf
+puts $fd $material_mtl
+close $fd
+
+set fd [open ${imagedir}/${casename}.obj w]
+fconfigure $fd -translation lf
+puts $fd $ml_obj
+close $fd
+
+ReadObj D ${imagedir}/${casename}.obj
+XGetOneShape s D
+
+explode s
+set md [XGetVisMaterial D s_4]
+if { [string trimright $md] != "EMPTY" } { puts "Error: EMPTY material is expected for last group" }