Fix Vector.project crash w/ >4 length vectors
authorCampbell Barton <ideasman42@gmail.com>
Fri, 27 Jul 2018 07:40:01 +0000 (17:40 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 27 Jul 2018 07:41:20 +0000 (17:41 +1000)
source/blender/python/mathutils/mathutils_Vector.c

index a06a63c806775116111dea86d29ced6a78b2f07a..6a40f22d9dfd6dac17dc9088381a0ef17c6c4439 100644 (file)
@@ -1127,23 +1127,17 @@ PyDoc_STRVAR(Vector_project_doc,
 static PyObject *Vector_project(VectorObject *self, PyObject *value)
 {
        const int size = self->size;
-       float tvec[MAX_DIMENSIONS];
-       float vec[MAX_DIMENSIONS];
+       float *tvec;
        double dot = 0.0f, dot2 = 0.0f;
        int x;
 
-       if (mathutils_array_parse(tvec, size, size, value, "Vector.project(other), invalid 'other' arg") == -1)
+       if (BaseMath_ReadCallback(self) == -1)
                return NULL;
 
-       if (self->size > 4) {
-               PyErr_SetString(PyExc_ValueError,
-                               "Vector must be 2D, 3D or 4D");
+       if (mathutils_array_parse_alloc(&tvec, size, value, "Vector.project(other), invalid 'other' arg") == -1) {
                return NULL;
        }
 
-       if (BaseMath_ReadCallback(self) == -1)
-               return NULL;
-
        /* get dot products */
        for (x = 0; x < size; x++) {
                dot += (double)(self->vec[x] * tvec[x]);
@@ -1152,9 +1146,9 @@ static PyObject *Vector_project(VectorObject *self, PyObject *value)
        /* projection */
        dot /= dot2;
        for (x = 0; x < size; x++) {
-               vec[x] = (float)dot * tvec[x];
+               tvec[x] *= (float)dot;
        }
-       return Vector_CreatePyObject(vec, size, Py_TYPE(self));
+       return Vector_CreatePyObject_alloc(tvec, size, Py_TYPE(self));
 }
 
 PyDoc_STRVAR(Vector_lerp_doc,