fix for NULL pointer free and add in some checks, while looking into bug [#29521],

add asserts so we know if an invalid active index is ever set.
This commit is contained in:
2011-12-07 09:13:15 +00:00
parent c292bf18be
commit 2b49d05338
3 changed files with 42 additions and 18 deletions

View File

@@ -1608,21 +1608,37 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
sel, sel_mirr, \ sel, sel_mirr, \
flip_map, flip_map_len, \ flip_map, flip_map_len, \
mirror_weights, flip_vgroups, \ mirror_weights, flip_vgroups, \
all_vgroups, act_vgroup \ all_vgroups, def_nr \
) )
EditVert *eve, *eve_mirr; EditVert *eve, *eve_mirr;
MDeformVert *dvert, *dvert_mirr; MDeformVert *dvert, *dvert_mirr;
short sel, sel_mirr; short sel, sel_mirr;
int *flip_map, flip_map_len; int *flip_map, flip_map_len;
const int act_vgroup= ob->actdef > 0 ? ob->actdef-1 : 0; const int def_nr= ob->actdef-1;
if(mirror_weights==0 && flip_vgroups==0) if ( (mirror_weights==0 && flip_vgroups==0) ||
(BLI_findlink(&ob->defbase, def_nr) == NULL) )
{
return; return;
}
flip_map= all_vgroups ? if (flip_vgroups) {
defgroup_flip_map(ob, &flip_map_len, FALSE) : flip_map= all_vgroups ?
defgroup_flip_map_single(ob, &flip_map_len, FALSE, act_vgroup); defgroup_flip_map(ob, &flip_map_len, FALSE) :
defgroup_flip_map_single(ob, &flip_map_len, FALSE, def_nr);
BLI_assert(flip_map != NULL);
if (flip_map == NULL) {
/* something went wrong!, possibly no groups */
return;
}
}
else {
flip_map= NULL;
flip_map_len= 0;
}
/* only the active group */ /* only the active group */
if(ob->type == OB_MESH) { if(ob->type == OB_MESH) {
@@ -1631,8 +1647,7 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
if (em) { if (em) {
if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) { if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
MEM_freeN(flip_map); goto cleanup;
return;
} }
EM_cache_x_mirror_vert(ob, em); EM_cache_x_mirror_vert(ob, em);
@@ -1654,7 +1669,6 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
eve->tmp.v= eve_mirr->tmp.v= NULL; eve->tmp.v= eve_mirr->tmp.v= NULL;
} }
} }
BKE_mesh_end_editmesh(me, em); BKE_mesh_end_editmesh(me, em);
} }
else { else {
@@ -1664,8 +1678,7 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0; const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
if (me->dvert == NULL) { if (me->dvert == NULL) {
MEM_freeN(flip_map); goto cleanup;
return;
} }
if (!use_vert_sel) { if (!use_vert_sel) {
@@ -1712,8 +1725,7 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
if(lt->editlatt) lt= lt->editlatt->latt; if(lt->editlatt) lt= lt->editlatt->latt;
if(lt->pntsu == 1 || lt->dvert == NULL) { if(lt->pntsu == 1 || lt->dvert == NULL) {
MEM_freeN(flip_map); goto cleanup;
return;
} }
/* unlike editmesh we know that by only looping over the first hald of /* unlike editmesh we know that by only looping over the first hald of
@@ -1749,9 +1761,11 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
} }
} }
MEM_freeN(flip_map); cleanup:
if (flip_map) MEM_freeN(flip_map);
#undef VGROUP_MIRR_OP #undef VGROUP_MIRR_OP
} }
static void vgroup_remap_update_users(Object *ob, int *map) static void vgroup_remap_update_users(Object *ob, int *map)
@@ -2733,6 +2747,7 @@ static int set_active_group_exec(bContext *C, wmOperator *op)
int nr= RNA_enum_get(op->ptr, "group"); int nr= RNA_enum_get(op->ptr, "group");
ob->actdef= nr+1; ob->actdef= nr+1;
BLI_assert(ob->actdef >= 0);
DAG_id_tag_update(&ob->id, OB_RECALC_DATA); DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob); WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob);
@@ -2811,7 +2826,7 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
MDeformVert *dvert= NULL; MDeformVert *dvert= NULL;
bDeformGroup *def; bDeformGroup *def;
int def_tot = BLI_countlist(&ob->defbase); int def_tot = BLI_countlist(&ob->defbase);
int *sort_map_update= MEM_mallocN(MAX_VGROUP_NAME * sizeof(int) * def_tot + 1, "sort vgroups"); /* needs a dummy index at the start*/ int *sort_map_update= MEM_mallocN(sizeof(int) * (def_tot + 1), "sort vgroups"); /* needs a dummy index at the start*/
int *sort_map= sort_map_update + 1; int *sort_map= sort_map_update + 1;
char *name; char *name;
int i; int i;
@@ -2820,6 +2835,8 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
for(def= ob->defbase.first, i=0; def; def=def->next, i++){ for(def= ob->defbase.first, i=0; def; def=def->next, i++){
sort_map[i]= BLI_findstringindex(&ob->defbase, name, offsetof(bDeformGroup, name)); sort_map[i]= BLI_findstringindex(&ob->defbase, name, offsetof(bDeformGroup, name));
name += MAX_VGROUP_NAME; name += MAX_VGROUP_NAME;
BLI_assert(sort_map[i] != -1);
} }
if(ob->mode == OB_MODE_EDIT) { if(ob->mode == OB_MODE_EDIT) {
@@ -2861,6 +2878,7 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
vgroup_remap_update_users(ob, sort_map_update); vgroup_remap_update_users(ob, sort_map_update);
ob->actdef= sort_map_update[ob->actdef]; ob->actdef= sort_map_update[ob->actdef];
BLI_assert(ob->actdef >= 0);
MEM_freeN(sort_map_update); MEM_freeN(sort_map_update);

View File

@@ -1022,6 +1022,7 @@ static int weight_sample_group_exec(bContext *C, wmOperator *op)
view3d_set_viewcontext(C, &vc); view3d_set_viewcontext(C, &vc);
vc.obact->actdef= type + 1; vc.obact->actdef= type + 1;
BLI_assert(vc.obact->actdef >= 0);
DAG_id_tag_update(&vc.obact->id, OB_RECALC_DATA); DAG_id_tag_update(&vc.obact->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, vc.obact); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, vc.obact);
@@ -1879,10 +1880,13 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *UNUSED
if(pchan) { if(pchan) {
bDeformGroup *dg= defgroup_find_name(ob, pchan->name); bDeformGroup *dg= defgroup_find_name(ob, pchan->name);
if(dg==NULL) if(dg==NULL) {
dg= ED_vgroup_add_name(ob, pchan->name); /* sets actdef */ dg= ED_vgroup_add_name(ob, pchan->name); /* sets actdef */
else }
else {
ob->actdef= 1 + defgroup_find_index(ob, dg); ob->actdef= 1 + defgroup_find_index(ob, dg);
BLI_assert(ob->actdef >= 0);
}
} }
} }
} }
@@ -1954,7 +1958,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
wpi.defbase_tot= wpd->defbase_tot; wpi.defbase_tot= wpd->defbase_tot;
wpi.defbase_sel= MEM_mallocN(wpi.defbase_tot*sizeof(char), "wpi.defbase_sel"); wpi.defbase_sel= MEM_mallocN(wpi.defbase_tot*sizeof(char), "wpi.defbase_sel");
wpi.defbase_tot_sel= get_selected_defgroups(ob, wpi.defbase_sel, wpi.defbase_tot); wpi.defbase_tot_sel= get_selected_defgroups(ob, wpi.defbase_sel, wpi.defbase_tot);
if(wpi.defbase_tot_sel == 0 && ob->actdef) wpi.defbase_tot_sel = 1; if(wpi.defbase_tot_sel == 0 && ob->actdef > 0) wpi.defbase_tot_sel = 1;
wpi.defbase_tot_unsel= wpi.defbase_tot - wpi.defbase_tot_sel; wpi.defbase_tot_unsel= wpi.defbase_tot - wpi.defbase_tot_sel;
wpi.vgroup_mirror= wpd->vgroup_mirror; wpi.vgroup_mirror= wpd->vgroup_mirror;
wpi.lock_flags= wpd->lock_flags; wpi.lock_flags= wpd->lock_flags;

View File

@@ -397,6 +397,8 @@ static int tree_element_active_defgroup(bContext *C, Scene *scene, TreeElement *
ob= (Object *)tselem->id; ob= (Object *)tselem->id;
if(set) { if(set) {
ob->actdef= te->index+1; ob->actdef= te->index+1;
BLI_assert(ob->actdef >= 0);
DAG_id_tag_update(&ob->id, OB_RECALC_DATA); DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob); WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
} }