- fix leak on STL loading if realloc fails.
authorCampbell Barton <ideasman42@gmail.com>
Sat, 12 Feb 2011 14:25:54 +0000 (14:25 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 12 Feb 2011 14:25:54 +0000 (14:25 +0000)
- transform code was using sprintf reading and writing the same string (undefined behavior).
- softbody had unneeded NULL check.

source/blender/blenkernel/intern/exotic.c
source/blender/blenkernel/intern/softbody.c
source/blender/editors/transform/transform.c

index 641313b..ba36a82 100644 (file)
@@ -364,10 +364,16 @@ static void read_stl_mesh_ascii(Scene *scene, const char *str)
                 * sure we have enough storage for some more faces
                 */
                if ( (totface) && ( (totface % 10000) == 0 ) ) {
+                       float  *vertdata_old= vertdata;
                        ++numtenthousand;
                        vertdata = realloc(vertdata, 
                                                           numtenthousand*3*30000*sizeof(float));
-                       if (!vertdata) { STLALLOCERROR; }
+                       if (!vertdata) {
+                               if(vertdata_old) {
+                                       free(vertdata_old);
+                               }
+                               STLALLOCERROR;
+                       }
                }
                
                /* Don't read normal, but check line for proper syntax anyway
index 3704792..19f7884 100644 (file)
@@ -1647,9 +1647,7 @@ static void scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow)
   ListBase *do_effector = NULL;
 
   do_effector = pdInitEffectors(scene, ob, NULL, sb->effector_weights);
-  if (sb){
-         _scan_for_ext_spring_forces(scene, ob, timenow, 0, sb->totspring, do_effector);
-  }
+  _scan_for_ext_spring_forces(scene, ob, timenow, 0, sb->totspring, do_effector);
   pdEndEffectors(&do_effector);
 }
 
index 394dd43..4332180 100644 (file)
@@ -2525,6 +2525,7 @@ void initResize(TransInfo *t)
 
 static void headerResize(TransInfo *t, float vec[3], char *str) {
        char tvec[60];
+       char *spos= str;
        if (hasNumInput(&t->num)) {
                outputNumInput(&(t->num), tvec);
        }
@@ -2537,24 +2538,27 @@ static void headerResize(TransInfo *t, float vec[3], char *str) {
        if (t->con.mode & CON_APPLY) {
                switch(t->num.idx_max) {
                case 0:
-                       sprintf(str, "Scale: %s%s %s", &tvec[0], t->con.text, t->proptext);
+                       spos += sprintf(spos, "Scale: %s%s %s", &tvec[0], t->con.text, t->proptext);
                        break;
                case 1:
-                       sprintf(str, "Scale: %s : %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
+                       spos += sprintf(spos, "Scale: %s : %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
                        break;
                case 2:
-                       sprintf(str, "Scale: %s : %s : %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
+                       spos += sprintf(spos, "Scale: %s : %s : %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
                }
        }
        else {
                if (t->flag & T_2D_EDIT)
-                       sprintf(str, "Scale X: %s   Y: %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
+                       spos += sprintf(spos, "Scale X: %s   Y: %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
                else
-                       sprintf(str, "Scale X: %s   Y: %s  Z: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
+                       spos += sprintf(spos, "Scale X: %s   Y: %s  Z: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
        }
        
-       if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED))
-               sprintf(str, "%s Proportional size: %.2f", str, t->prop_size);
+       if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED)) {
+               spos += sprintf(spos, " Proportional size: %.2f", t->prop_size);
+       }
+
+       (void)spos;
 }
 
 #define SIGN(a)                (a<-FLT_EPSILON?1:a>FLT_EPSILON?2:3)