[Bf-blender-cvs] [3c341523348] cycles_procedural_api: fix crash dereferencing nul pointer

Kévin Dietrich noreply at git.blender.org
Sat Oct 3 04:18:23 CEST 2020


Commit: 3c3415233481306072f154db1d33b89ec2d13bb2
Author: Kévin Dietrich
Date:   Fri Oct 2 23:38:10 2020 +0200
Branches: cycles_procedural_api
https://developer.blender.org/rB3c3415233481306072f154db1d33b89ec2d13bb2

fix crash dereferencing nul pointer

===================================================================

M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h

===================================================================

diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index f4d814c68db..4be8d9a723f 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -762,8 +762,11 @@ static void create_mesh(Scene *scene,
   }
 
   /* allocate memory */
+  if (subdivision) {
+    mesh->reserve_subd_faces(numfaces, numngons, numcorners);
+  }
+
   mesh->reserve_mesh(numverts, numtris);
-  mesh->reserve_subd_faces(numfaces, numngons, numcorners);
 
   /* create vertex coordinates and normals */
   BL::Mesh::vertices_iterator v;
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index a7f88be4bd7..5786aeff22b 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -186,6 +186,7 @@ Mesh::Mesh(const NodeType *node_type, Type geom_type_)
   corner_offset = 0;
 
   num_subd_verts = 0;
+  num_subd_faces = 0;
 
   num_ngons = 0;
 
@@ -245,6 +246,7 @@ void Mesh::resize_subd_faces(int numfaces, int num_ngons_, int numcorners)
   subd_ptex_offset.resize(numfaces);
   subd_face_corners.resize(numcorners);
   num_ngons = num_ngons_;
+  num_subd_faces = numfaces;
 
   subd_attributes.resize();
 }
@@ -258,6 +260,7 @@ void Mesh::reserve_subd_faces(int numfaces, int num_ngons_, int numcorners)
   subd_ptex_offset.reserve(numfaces);
   subd_face_corners.reserve(numcorners);
   num_ngons = num_ngons_;
+  num_subd_faces = numfaces;
 
   subd_attributes.resize(true);
 }
@@ -289,6 +292,7 @@ void Mesh::clear(bool preserve_voxel_data)
   subd_face_corners.clear();
 
   num_subd_verts = 0;
+  num_subd_faces = 0;
 
   subd_creases_edge.clear();
   subd_creases_weight.clear();
@@ -358,9 +362,9 @@ void Mesh::add_subd_face(int *corners, int num_corners, int shader_, bool smooth
   }
 
   int ptex_offset = 0;
-
-  if (get_num_subd_faces()) {
-    SubdFace s = get_subd_face(get_num_subd_faces() - 1);
+  // cannot use get_num_subd_faces here as it holds the total number of subd_faces, but we do not have the total amount of data yet
+  if (subd_shader.size()) {
+    SubdFace s = get_subd_face(subd_shader.size() - 1);
     ptex_offset = s.ptex_offset + s.num_ptex_faces();
   }
 
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index f00be5466f9..52e04ac0941 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -176,6 +176,7 @@ class Mesh : public Geometry {
   size_t corner_offset;
 
   size_t num_subd_verts;
+  size_t num_subd_faces;
 
   unordered_map<int, int> vert_to_stitching_key_map; /* real vert index -> stitching index */
   unordered_multimap<int, int>
@@ -239,7 +240,7 @@ class Mesh : public Geometry {
 
   size_t get_num_subd_faces() const
   {
-    return subd_shader.size();
+    return num_subd_faces;
   }
 
   size_t get_num_subd_verts()



More information about the Bf-blender-cvs mailing list