Revision: 26480
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26480
Author:   campbellbarton
Date:     2010-01-31 23:50:07 +0100 (Sun, 31 Jan 2010)

Log Message:
-----------
setting invalid vector swizzle attributes (from blender2.4x docs for instance), 
could crash blender.
 - disallow setting swizzle's that have duplicate values: vec.xxx = [1,2,3]
 - raise an error if the list setting a swizzle's longer.
 - mathutils write callback was running on the wrong vector, which could crash 
blender.

Modified Paths:
--------------
    trunk/blender/source/blender/python/doc/examples/mathutils_vector.py
    trunk/blender/source/blender/python/generic/vector.c

Modified: trunk/blender/source/blender/python/doc/examples/mathutils_vector.py
===================================================================
--- trunk/blender/source/blender/python/doc/examples/mathutils_vector.py        
2010-01-31 21:52:26 UTC (rev 26479)
+++ trunk/blender/source/blender/python/doc/examples/mathutils_vector.py        
2010-01-31 22:50:07 UTC (rev 26480)
@@ -50,6 +50,6 @@
 # Vectors support 'swizzle' operations
 # See http://en.wikipedia.org/wiki/Swizzling_(computer_graphics)
 vec.xyz = vec.zyx
-vec.xy = vec.zw
-vec.xxy = vec.wzz
-vec.yzyz = vec.yxyx
+vec.xy = vec4d.zw
+vec.xyz = vec4d.wzz
+vec4d.wxyz = vec.yxyx

Modified: trunk/blender/source/blender/python/generic/vector.c
===================================================================
--- trunk/blender/source/blender/python/generic/vector.c        2010-01-31 
21:52:26 UTC (rev 26479)
+++ trunk/blender/source/blender/python/generic/vector.c        2010-01-31 
22:50:07 UTC (rev 26480)
@@ -793,8 +793,7 @@
 
        list = PyList_New(end - begin);
        for(count = begin; count < end; count++) {
-               PyList_SetItem(list, count - begin,
-                               PyFloat_FromDouble(self->vec[count]));
+               PyList_SET_ITEM(list, count - begin, 
PyFloat_FromDouble(self->vec[count]));
        }
 
        return list;
@@ -1510,6 +1509,11 @@
        while (swizzleClosure & SWIZZLE_VALID_AXIS)
        {
                axisB = swizzleClosure & SWIZZLE_AXIS;
+               if(axisB >= self->size) {
+                       PyErr_SetString(PyExc_AttributeError, "Error: vector 
does not have specified axis.");
+                       return NULL;
+               }
+
                vec[axisA] = self->vec[axisB];
                swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS;
                axisA++;
@@ -1567,11 +1571,23 @@
                while (swizzleClosure & SWIZZLE_VALID_AXIS && axisB < 
vecVal->size)
                {
                        axisA = swizzleClosure & SWIZZLE_AXIS;
+
+                       if(axisB >= vecVal->size) {
+                               PyErr_SetString(PyExc_AttributeError, "Error: 
vector does not have specified axis.");
+                               return -1;
+                       }
+
                        vecTemp[axisA] = vecVal->vec[axisB];
                        
                        swizzleClosure = swizzleClosure >> 
SWIZZLE_BITS_PER_AXIS;
                        axisB++;
                }
+
+               if(axisB != vecVal->size) {
+                       PyErr_SetString(PyExc_AttributeError, "Error: vector 
size does not match swizzle.\n");
+                       return -1;
+               }
+
                memcpy(self->vec, vecTemp, axisB * sizeof(float));
                /* continue with BaseMathObject_WriteCallback at the end */
        }
@@ -1585,9 +1601,9 @@
                {
                        item = PyList_GetItem(value, axisB);
                        scalarVal = (float)PyFloat_AsDouble(item);
-                       
+
                        if (scalarVal==-1.0 && PyErr_Occurred()) {
-                               PyErr_SetString(PyExc_AttributeError, "Error: 
vector does not have specified axis.\n");
+                               PyErr_SetString(PyExc_AttributeError, "Error: 
list item could not be used as a float.\n");
                                return -1;
                        }
                        
@@ -1598,6 +1614,12 @@
                        swizzleClosure = swizzleClosure >> 
SWIZZLE_BITS_PER_AXIS;
                        axisB++;
                }
+
+               if(axisB != listLen) {
+                       PyErr_SetString(PyExc_AttributeError, "Error: list size 
does not match swizzle.\n");
+                       return -1;
+               }
+
                memcpy(self->vec, vecTemp, axisB * sizeof(float));
                /* continue with BaseMathObject_WriteCallback at the end */
        }
@@ -1619,7 +1641,7 @@
                return -1;
        }
        
-       if(!BaseMath_WriteCallback(vecVal))
+       if(!BaseMath_WriteCallback(self))
                return -1;
        else
                return 0;
@@ -1639,342 +1661,342 @@
        {"_owner", (getter)BaseMathObject_getOwner, (setter)NULL, 
BaseMathObject_Owner_doc, NULL},
        
        /* autogenerated swizzle attrs, see python script below */
-       {"xx",   (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 36 */
-       {"xxx",  (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, /* 292 */
-       {"xxxx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 2340 */
-       {"xxxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 2852 */
-       {"xxxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 3364 */
-       {"xxxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 3876 */
-       {"xxy",  (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, /* 356 */
-       {"xxyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 2404 */
-       {"xxyy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 2916 */
-       {"xxyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 3428 */
-       {"xxyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 3940 */
-       {"xxz",  (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, /* 420 */
-       {"xxzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 2468 */
-       {"xxzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 2980 */
-       {"xxzz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 3492 */
-       {"xxzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 4004 */
-       {"xxw",  (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, /* 484 */
-       {"xxwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 2532 */
-       {"xxwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 3044 */
-       {"xxwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 3556 */
-       {"xxww", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 4068 */
-       {"xy",   (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 44 */
-       {"xyx",  (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, /* 300 */
-       {"xyxx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 2348 */
-       {"xyxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 2860 */
-       {"xyxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, 
SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | 
((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | 
((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | 
((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3)))  )}, /* 3372 */

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to