Cycles: Prevent crash in special cases when object has less slots than mesh
authorSergey Sharybin <sergey.vfx@gmail.com>
Fri, 23 Sep 2016 13:57:39 +0000 (15:57 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 26 Sep 2016 08:51:51 +0000 (10:51 +0200)
This is something what was guaranteed in give_current_material(), just
copied some range checking logic from there.

Not sure what would be a proper fix here tho.

source/blender/blenkernel/intern/mesh.c

index ba3aef81514a482c2fafd1621229c5c87945dd6d..49e35585995dfaca18f78e46861627c7c762c66b 100644 (file)
@@ -2368,8 +2368,12 @@ Mesh *BKE_mesh_new_from_object(
                        if (tmpcu->mat) {
                                for (i = tmpcu->totcol; i-- > 0; ) {
                                        /* are we an object material or data based? */
-
-                                       tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : tmpcu->mat[i];
+                                       if (ob->matbits[i] && i >= ob->totcol) {
+                                               tmpmesh->mat[i] = NULL;
+                                       }
+                                       else {
+                                               tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : tmpcu->mat[i];
+                                       }
 
                                        if (do_mat_id_us && tmpmesh->mat[i]) {
                                                id_us_plus(&tmpmesh->mat[i]->id);
@@ -2388,7 +2392,12 @@ Mesh *BKE_mesh_new_from_object(
                        if (tmpmb->mat) {
                                for (i = tmpmb->totcol; i-- > 0; ) {
                                        /* are we an object material or data based? */
-                                       tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : tmpmb->mat[i];
+                                       if (ob->matbits[i] && i >= ob->totcol) {
+                                               tmpmesh->mat[i] = NULL;
+                                       }
+                                       else {
+                                               tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : tmpmb->mat[i];
+                                       }
 
                                        if (do_mat_id_us && tmpmesh->mat[i]) {
                                                id_us_plus(&tmpmesh->mat[i]->id);
@@ -2408,7 +2417,12 @@ Mesh *BKE_mesh_new_from_object(
                                if (origmesh->mat) {
                                        for (i = origmesh->totcol; i-- > 0; ) {
                                                /* are we an object material or data based? */
-                                               tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : origmesh->mat[i];
+                                               if (ob->matbits[i] && i >= ob->totcol) {
+                                                       tmpmesh->mat[i] = NULL;
+                                               }
+                                               else {
+                                                       tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : origmesh->mat[i];
+                                               }
 
                                                if (do_mat_id_us && tmpmesh->mat[i]) {
                                                        id_us_plus(&tmpmesh->mat[i]->id);