[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57196] trunk/blender/source/blender/bmesh /operators/bmo_subdivide_edgering.c: fix for crash in edgering subd when 3+ disconnected edge rings were found.

Campbell Barton ideasman42 at gmail.com
Sun Jun 2 19:02:57 CEST 2013


Revision: 57196
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57196
Author:   campbellbarton
Date:     2013-06-02 17:02:56 +0000 (Sun, 02 Jun 2013)
Log Message:
-----------
fix for crash in edgering subd when 3+ disconnected edge rings were found.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c

Modified: trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c	2013-06-02 15:58:43 UTC (rev 57195)
+++ trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c	2013-06-02 17:02:56 UTC (rev 57196)
@@ -249,18 +249,19 @@
 
 				el_store_other = BLI_ghash_lookup(vert_eloop_gh, v_other);
 
-				BLI_assert(el_store != NULL);
-				BLI_assert(el_store_other != NULL);
+				/* in rare cases we cant find a match */
+				if (el_store_other) {
+					pair_test.first = el_store;
+					pair_test.second = el_store_other;
 
-				pair_test.first = el_store;
-				pair_test.second = el_store_other;
+					if (pair_test.first > pair_test.second)
+						SWAP(const void *, pair_test.first, pair_test.second);
 
-				if (pair_test.first > pair_test.second)
-					SWAP(const void *, pair_test.first, pair_test.second);
+					if (!BLI_ghash_haskey(eloop_pair_gh, &pair_test)) {
+						GHashPair *pair = BLI_ghashutil_pairalloc(pair_test.first, pair_test.second);
+						BLI_ghash_insert(eloop_pair_gh, pair, NULL);
+					}
 
-				if (!BLI_ghash_haskey(eloop_pair_gh, &pair_test)) {
-					GHashPair *pair = BLI_ghashutil_pairalloc(pair_test.first, pair_test.second);
-					BLI_ghash_insert(eloop_pair_gh, pair, NULL);
 				}
 			}
 		}
@@ -268,6 +269,11 @@
 
 	BLI_ghash_free(vert_eloop_gh, NULL, NULL);
 
+	if (BLI_ghash_size(eloop_pair_gh) == 0) {
+		BLI_ghash_free(eloop_pair_gh, NULL, NULL);
+		eloop_pair_gh = NULL;
+	}
+
 	return eloop_pair_gh;
 }
 
@@ -1151,16 +1157,27 @@
 			                          interp_mode, cuts, smooth, falloff_cache);
 			bm_edgering_pair_store_free(lpair, interp_mode);
 		}
+		else {
+			BMO_error_raise(bm, op, BMERR_INVALID_SELECTION,
+			                "Edge-ring pair isn't connected");
+			goto cleanup;
+		}
 	}
 	else {
 		GHashIterator gh_iter;
 		int i;
 
 		GHash *eloop_pairs_gh = bm_edgering_pair_calc(bm, &eloops_rim);
+		LoopPairStore **lpair_arr;
 
-		const int eloop_pairs_len = BLI_ghash_size(eloop_pairs_gh);
-		LoopPairStore **lpair_arr = BLI_array_alloca(lpair_arr, eloop_pairs_len);
+		if (eloop_pairs_gh == NULL) {
+			BMO_error_raise(bm, op, BMERR_INVALID_SELECTION,
+			                "Edge-rings are not connected");
+			goto cleanup;
+		}
 
+		lpair_arr = BLI_array_alloca(lpair_arr, BLI_ghash_size(eloop_pairs_gh));
+
 		/* first cache pairs */
 		GHASH_ITER_INDEX (gh_iter, eloop_pairs_gh, i) {
 			GHashPair *eloop_pair = BLI_ghashIterator_getKey(&gh_iter);




More information about the Bf-blender-cvs mailing list