[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48488] trunk/blender/source/blender/ blenkernel/intern/mesh_validate.c: Validate mesh selection stack in mesh_validate function

Sergey Sharybin sergey.vfx at gmail.com
Mon Jul 2 11:57:48 CEST 2012


Revision: 48488
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48488
Author:   nazgul
Date:     2012-07-02 09:57:31 +0000 (Mon, 02 Jul 2012)
Log Message:
-----------
Validate mesh selection stack in mesh_validate function

Related on #31944: Blender crashes on switching to mesh edit mode

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/mesh_validate.c

Modified: trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh_validate.c	2012-07-02 09:34:13 UTC (rev 48487)
+++ trunk/blender/source/blender/blenkernel/intern/mesh_validate.c	2012-07-02 09:57:31 UTC (rev 48488)
@@ -211,6 +211,7 @@
 
 	short verts_fixed = FALSE;
 	short vert_weights_fixed = FALSE;
+	int msel_fixed = FALSE;
 
 	int do_edge_recalc = FALSE;
 
@@ -754,8 +755,6 @@
 		}
 	}
 
-	PRINT("BKE_mesh_validate: finished\n\n");
-
 #   undef REMOVE_EDGE_TAG
 #   undef IS_REMOVED_EDGE
 #   undef REMOVE_LOOP_TAG
@@ -779,7 +778,51 @@
 		}
 	}
 
-	return (verts_fixed || vert_weights_fixed || do_polyloop_free || do_edge_free || do_edge_recalc);
+	if (mesh && mesh->mselect) {
+		MSelect *msel;
+		int free_msel = FALSE;
+
+		for (i = 0, msel = mesh->mselect; i < mesh->totselect; i++, msel++) {
+			int tot_elem;
+
+			if (msel->index < 0) {
+				PRINT("Mesh select element %d type %d index is negative, "
+				      "resetting selection stack.\n", i, msel->type);
+				free_msel = TRUE;
+				break;
+			}
+
+			switch (msel->type) {
+				case ME_VSEL:
+					tot_elem = mesh->totvert;
+					break;
+				case ME_ESEL:
+					tot_elem = mesh->totedge;
+					break;
+				case ME_FSEL:
+					tot_elem = mesh->totface;
+					break;
+			}
+
+			if (msel->index > tot_elem) {
+				PRINT("Mesh select element %d type %d index %d is larger than data array size %d, "
+				      "resetting selection stack.\n", i, msel->type, msel->index, tot_elem);
+
+				free_msel = TRUE;
+				break;
+			}
+		}
+
+		if (free_msel) {
+			MEM_freeN(mesh->mselect);
+			mesh->mselect = NULL;
+			mesh->totselect = 0;
+		}
+	}
+
+	PRINT("BKE_mesh_validate: finished\n\n");
+
+	return (verts_fixed || vert_weights_fixed || do_polyloop_free || do_edge_free || do_edge_recalc || msel_fixed);
 }
 
 static int mesh_validate_customdata(CustomData *data, short do_verbose, const short do_fixes)




More information about the Bf-blender-cvs mailing list