diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-01-29 12:19:23 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-01-29 12:19:23 +0400 |
commit | 340845289b6b77c8d1390f237c25ebe46d3b7f30 (patch) | |
tree | 0a1396b08052bb228f2d97c703043bc52affdfce /source/blender/editors | |
parent | 7834f72282c308dd4927dad97320bccf33115327 (diff) |
fix [#34024] delete - Edge loop crash
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/transform/transform.c | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index e660a43767a..114a8c7a06c 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -5028,6 +5028,7 @@ static int createEdgeSlideVerts(TransInfo *t) BMEdge *e, *e1; BMVert *v, *v2; TransDataEdgeSlideVert *sv_array; + int sv_tot; BMBVHTree *btree; SmallHash table; EdgeSlideData *sld = MEM_callocN(sizeof(*sld), "sld"); @@ -5127,10 +5128,10 @@ static int createEdgeSlideVerts(TransInfo *t) return 0; } - sv_array = MEM_callocN(sizeof(TransDataEdgeSlideVert) * j, "sv_array"); + sv_tot = j; + sv_array = MEM_callocN(sizeof(TransDataEdgeSlideVert) * sv_tot, "sv_array"); loop_nr = 0; - j = 0; while (1) { BMLoop *l, *l1, *l2; BMVert *v_first; @@ -5190,10 +5191,10 @@ static int createEdgeSlideVerts(TransInfo *t) /*iterate over the loop*/ v_first = v; do { - TransDataEdgeSlideVert *sv = sv_array + j; - - BLI_assert(j < MEM_allocN_len(sv_array) / sizeof(*sv)); + TransDataEdgeSlideVert *sv; + /* XXX, 'sv' will initialize multiple times, this is suspicious. see [#34024] */ + sv = sv_array + GET_INT_FROM_POINTER(BLI_smallhash_lookup(&table, (uintptr_t)v)); sv->v = v; sv->origvert = *v; sv->loop_nr = loop_nr; @@ -5215,11 +5216,7 @@ static int createEdgeSlideVerts(TransInfo *t) e1 = e; e = get_other_edge(v, e); if (!e) { - //v2=v, v = BM_edge_other_vert(l1->e, v); - - BLI_assert(j + 1 < MEM_allocN_len(sv_array) / sizeof(*sv)); - - sv = sv_array + j + 1; + sv = sv_array + GET_INT_FROM_POINTER(BLI_smallhash_lookup(&table, (uintptr_t)v)); sv->v = v; sv->origvert = *v; sv->loop_nr = loop_nr; @@ -5236,16 +5233,13 @@ static int createEdgeSlideVerts(TransInfo *t) BM_elem_flag_disable(v, BM_ELEM_TAG); BM_elem_flag_disable(v2, BM_ELEM_TAG); - - j += 2; + break; } l1 = get_next_loop(v, l1, e1, e, vec); l2 = l2 ? get_next_loop(v, l2, e1, e, vec2) : NULL; - j += 1; - BM_elem_flag_disable(v, BM_ELEM_TAG); BM_elem_flag_disable(v2, BM_ELEM_TAG); } while (e != v_first->e && l1); @@ -5256,7 +5250,7 @@ static int createEdgeSlideVerts(TransInfo *t) /* EDBM_flag_disable_all(em, BM_ELEM_SELECT); */ sld->sv = sv_array; - sld->totsv = j; + sld->totsv = sv_tot; /* find mouse vectors, the global one, and one per loop in case we have * multiple loops selected, in case they are oriented different */ |