fix for crash caused by invalid active material index while editing text.
authorCampbell Barton <ideasman42@gmail.com>
Tue, 11 Oct 2011 23:08:17 +0000 (23:08 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 11 Oct 2011 23:08:17 +0000 (23:08 +0000)
also added some better error checking in object_remove_material_slot() so it will print an error rather then crashing if this case ever happens again.

source/blender/blenkernel/intern/font.c
source/blender/blenkernel/intern/material.c
source/blender/editors/curve/editfont.c

index 4c8d0cf998d53f989e87094088848b992e800576..9c01b35b91ac1079b142089f427b7ee8ca7f1c3a 100644 (file)
@@ -546,7 +546,7 @@ static void buildchar(Main *bmain, Curve *cu, unsigned long character, CharInfo
                        nu2->knotsu = nu2->knotsv = NULL;
                        nu2->flag= CU_SMOOTH;
                        nu2->charidx = charidx;
-                       if (info->mat_nr) {
+                       if (info->mat_nr > 0) {
                                nu2->mat_nr= info->mat_nr-1;
                        }
                        else {
index ed9be989dbd5a44fb816b096df89f762ec087482..ebd05ab9bf885fdfb0aea143b8bea28afc23126d 100644 (file)
@@ -1105,8 +1105,17 @@ int object_remove_material_slot(Object *ob)
        short *totcolp;
        short a, actcol;
        
-       if(ob==NULL || ob->totcol==0) return FALSE;
-       
+       if (ob==NULL || ob->totcol==0) {
+               return FALSE;
+       }
+
+       /* this should never happen and used to crash */
+       if (ob->actcol <= 0) {
+               printf("%s: invalid material index %d, report a bug!\n", __func__, ob->actcol);
+               BLI_assert(0);
+               return FALSE;
+       }
+
        /* take a mesh/curve/mball as starting point, remove 1 index,
         * AND with all objects that share the ob->data
         * 
@@ -1119,10 +1128,8 @@ int object_remove_material_slot(Object *ob)
        if(*matarar==NULL) return FALSE;
 
        /* we delete the actcol */
-       if(ob->totcol) {
-               mao= (*matarar)[ob->actcol-1];
-               if(mao) mao->id.us--;
-       }
+       mao= (*matarar)[ob->actcol-1];
+       if(mao) mao->id.us--;
        
        for(a=ob->actcol; a<ob->totcol; a++)
                (*matarar)[a-1]= (*matarar)[a];
index d8257c524c1409d16e9d457acbc3525235965dc1..19892d2c1ee4194ce34b1816754cceb18c1ae038 100644 (file)
@@ -264,9 +264,16 @@ static void text_update_edited(bContext *C, Scene *scene, Object *obedit, int re
        EditFont *ef= cu->editfont;
        cu->curinfo = ef->textbufinfo[cu->pos?cu->pos-1:0];
        
-       if(obedit->totcol>0)
+       if(obedit->totcol > 0) {
                obedit->actcol= ef->textbufinfo[cu->pos?cu->pos-1:0].mat_nr;
 
+               /* since this array is calloc'd, it can be 0 even though we try ensure
+                * (mat_nr > 0) almost everywhere */
+               if (obedit->actcol < 1) {
+                       obedit->actcol= 1;
+               }
+       }
+
        if(mode == FO_EDIT)
                update_string(cu);