[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14879] trunk/blender/source/blender: fix for [#11691] No checks in curve code for "Number of points <= Order U"

Campbell Barton ideasman42 at gmail.com
Sun May 18 00:38:11 CEST 2008


Revision: 14879
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14879
Author:   campbellbarton
Date:     2008-05-18 00:37:34 +0200 (Sun, 18 May 2008)

Log Message:
-----------
fix for [#11691] No checks in curve code for "Number of points <= Order U"
added checks for a nurbes orderu being larger then pntsu.
This has the same effect as the curve having only 1 point. (its display list is not generated 
but it is still added but a dummy displist with zero points is made)
memcpy was also being used where the memory overlaped (probably worked in most cases but this is incorrect and valgrind complained), use memmove 
instead.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/src/editcurve.c

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2008-05-17 13:41:34 UTC (rev 14878)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2008-05-17 22:37:34 UTC (rev 14879)
@@ -1476,7 +1476,9 @@
 	else nu= cu->nurb.first;
 	
 	while(nu) {
-		if(nu->pntsu<=1) {
+		/* check we are a single point? also check we are not a surface and that the orderu is sane,
+		 * enforced in the UI but can go wrong possibly */
+		if(nu->pntsu<2 || ((nu->type & 7)==CU_NURBS && nu->pntsu < nu->orderu)) {
 			bl= MEM_callocN(sizeof(BevList)+1*sizeof(BevPoint), "makeBevelList");
 			BLI_addtail(&(cu->bev), bl);
 			bl->nr= 0;

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2008-05-17 13:41:34 UTC (rev 14878)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2008-05-17 22:37:34 UTC (rev 14879)
@@ -783,7 +783,7 @@
 			else
 				resolu= nu->resolu;
 			
-			if(nu->pntsu<2);
+			if(nu->pntsu<2 || ((nu->type & 7)==CU_NURBS && nu->pntsu < nu->orderu));
 			else if((nu->type & 7)==CU_BEZIER) {
 				
 				/* count */

Modified: trunk/blender/source/blender/src/editcurve.c
===================================================================
--- trunk/blender/source/blender/src/editcurve.c	2008-05-17 13:41:34 UTC (rev 14878)
+++ trunk/blender/source/blender/src/editcurve.c	2008-05-17 22:37:34 UTC (rev 14879)
@@ -3658,6 +3658,11 @@
 					}
 				}
 			}
+			
+			/* Never allow the order to exceed the number of points */
+			if ((nu->type & 7)==CU_NURBS && (nu->pntsu < nu->orderu)) {
+				nu->orderu = nu->pntsu;
+			}
 			nu= next;
 		}
 		/* 2nd loop, delete small pieces: just for curves */
@@ -3669,7 +3674,7 @@
 				bezt= nu->bezt;
 				for(a=0;a<nu->pntsu;a++) {
 					if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
-						memcpy(bezt, bezt+1, (nu->pntsu-a-1)*sizeof(BezTriple));
+						memmove(bezt, bezt+1, (nu->pntsu-a-1)*sizeof(BezTriple));
 						nu->pntsu--;
 						a--;
 						event= 1;
@@ -3690,7 +3695,7 @@
 				
 				for(a=0;a<nu->pntsu;a++) {
 					if( bp->f1 & SELECT ) {
-						memcpy(bp, bp+1, (nu->pntsu-a-1)*sizeof(BPoint));
+						memmove(bp, bp+1, (nu->pntsu-a-1)*sizeof(BPoint));
 						nu->pntsu--;
 						a--;
 						event= 1;
@@ -3704,6 +3709,11 @@
 					memcpy(bp1, nu->bp, (nu->pntsu)*sizeof(BPoint) );
 					MEM_freeN(nu->bp);
 					nu->bp= bp1;
+					
+					/* Never allow the order to exceed the number of points */
+					if ((nu->type & 7)==CU_NURBS && (nu->pntsu < nu->orderu)) {
+						nu->orderu = nu->pntsu;
+					}
 				}
 				makeknots(nu, 1, nu->flagu>>1);
 			}





More information about the Bf-blender-cvs mailing list