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