fix memory leak in Object.GetSelected().
bugfix: #1631 Memory Leak in newMatrixObject PyMem_Malloc()s not followed with PyMem_Free(). allocation error checking contributed by Tom Musgrove.
This commit is contained in:
@@ -553,6 +553,7 @@ static PyObject *M_Object_GetSelected( PyObject * self, PyObject * args )
|
||||
}
|
||||
blen_object->object = G.scene->basact->object;
|
||||
PyList_Append( list, ( PyObject * ) blen_object );
|
||||
Py_DECREF( blen_object );
|
||||
}
|
||||
|
||||
base_iter = G.scene->base.first;
|
||||
@@ -570,6 +571,7 @@ static PyObject *M_Object_GetSelected( PyObject * self, PyObject * args )
|
||||
}
|
||||
blen_object->object = base_iter->object;
|
||||
PyList_Append( list, ( PyObject * ) blen_object );
|
||||
Py_DECREF( blen_object );
|
||||
}
|
||||
base_iter = base_iter->next;
|
||||
}
|
||||
|
||||
@@ -89,6 +89,10 @@ PyObject *Matrix_toQuat( MatrixObject * self )
|
||||
"inappropriate matrix size\n" );
|
||||
|
||||
mat = PyMem_Malloc( 3 * 3 * sizeof( float ) );
|
||||
if( mat == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating matrix\n\n" ) );
|
||||
}
|
||||
mat[0] = self->matrix[0][0];
|
||||
mat[1] = self->matrix[0][1];
|
||||
mat[2] = self->matrix[0][2];
|
||||
@@ -100,6 +104,11 @@ PyObject *Matrix_toQuat( MatrixObject * self )
|
||||
mat[8] = self->matrix[2][2];
|
||||
}
|
||||
quat = PyMem_Malloc( 4 * sizeof( float ) );
|
||||
if( quat == NULL ) {
|
||||
PyMem_Free( mat );
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating quat\n\n" ) );
|
||||
}
|
||||
Mat3ToQuat( ( float ( * )[3] ) mat, quat );
|
||||
|
||||
return ( PyObject * ) newQuaternionObject( quat );
|
||||
@@ -120,6 +129,10 @@ PyObject *Matrix_toEuler( MatrixObject * self )
|
||||
"inappropriate matrix size\n" );
|
||||
|
||||
mat = PyMem_Malloc( 3 * 3 * sizeof( float ) );
|
||||
if( mat == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
mat[0] = self->matrix[0][0];
|
||||
mat[1] = self->matrix[0][1];
|
||||
mat[2] = self->matrix[0][2];
|
||||
@@ -131,6 +144,11 @@ PyObject *Matrix_toEuler( MatrixObject * self )
|
||||
mat[8] = self->matrix[2][2];
|
||||
}
|
||||
eul = PyMem_Malloc( 3 * sizeof( float ) );
|
||||
if( eul == NULL ) {
|
||||
PyMem_Free( mat );
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating eul\n\n" ) );
|
||||
}
|
||||
Mat3ToEul( ( float ( * )[3] ) mat, eul );
|
||||
|
||||
for( x = 0; x < 3; x++ ) {
|
||||
@@ -143,13 +161,16 @@ PyObject *Matrix_toEuler( MatrixObject * self )
|
||||
PyObject *Matrix_Resize4x4( MatrixObject * self )
|
||||
{
|
||||
float *mat;
|
||||
float *contigPtr;
|
||||
int x, row, col;
|
||||
|
||||
if( self->colSize == 4 && self->rowSize == 4 )
|
||||
return EXPP_incr_ret( Py_None );
|
||||
|
||||
mat = PyMem_Malloc( 4 * 4 * sizeof( float ) );
|
||||
if( mat == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
for( x = 0; x < 16; x++ ) {
|
||||
mat[x] = 0.0f;
|
||||
}
|
||||
@@ -209,19 +230,21 @@ PyObject *Matrix_Resize4x4( MatrixObject * self )
|
||||
mat[15] = 1.0f;
|
||||
}
|
||||
|
||||
PyMem_Free( *self->matrix );
|
||||
contigPtr = PyMem_Malloc( 4 * 4 * sizeof( float ) );
|
||||
if( contigPtr == NULL ) {
|
||||
PyMem_Free( self->matrix );
|
||||
PyMem_Free( self->contigPtr );
|
||||
self->contigPtr = PyMem_Malloc( 4 * 4 * sizeof( float ) );
|
||||
if( self->contigPtr == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating array space\n\n" ) );
|
||||
}
|
||||
self->matrix = PyMem_Malloc( 4 * sizeof( float * ) );
|
||||
if( self->matrix == NULL ) {
|
||||
PyMem_Free( self->contigPtr );
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating pointer space\n\n" ) );
|
||||
}
|
||||
for( x = 0; x < 4; x++ ) {
|
||||
self->matrix[x] = contigPtr + ( x * 4 );
|
||||
self->matrix[x] = self->contigPtr + ( x * 4 );
|
||||
}
|
||||
|
||||
for( row = 0; row < 4; row++ ) {
|
||||
@@ -250,6 +273,10 @@ PyObject *Matrix_TranslationPart( MatrixObject * self )
|
||||
"inappropriate matrix size\n" );
|
||||
|
||||
vec = PyMem_Malloc( 3 * sizeof( float ) );
|
||||
if( vec == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating vec\n\n" ) );
|
||||
}
|
||||
vec[0] = self->matrix[3][0];
|
||||
vec[1] = self->matrix[3][1];
|
||||
vec[2] = self->matrix[3][2];
|
||||
@@ -271,6 +298,10 @@ PyObject *Matrix_RotationPart( MatrixObject * self )
|
||||
"inappropriate matrix size\n" );
|
||||
|
||||
mat = PyMem_Malloc( 3 * 3 * sizeof( float ) );
|
||||
if( mat == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
mat[0] = self->matrix[0][0];
|
||||
mat[1] = self->matrix[0][1];
|
||||
mat[2] = self->matrix[0][2];
|
||||
@@ -319,6 +350,11 @@ PyObject *Matrix_Invert( MatrixObject * self )
|
||||
if( self->rowSize == 2 ) {
|
||||
mat = PyMem_Malloc( self->rowSize * self->colSize *
|
||||
sizeof( float ) );
|
||||
if( mat == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError
|
||||
( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
mat[0] = self->matrix[1][1];
|
||||
mat[1] = -self->matrix[1][0];
|
||||
mat[2] = -self->matrix[0][1];
|
||||
@@ -326,10 +362,20 @@ PyObject *Matrix_Invert( MatrixObject * self )
|
||||
} else if( self->rowSize == 3 ) {
|
||||
mat = PyMem_Malloc( self->rowSize * self->colSize *
|
||||
sizeof( float ) );
|
||||
if( mat == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError
|
||||
( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
Mat3Adj( ( float ( * )[3] ) mat, *self->matrix );
|
||||
} else if( self->rowSize == 4 ) {
|
||||
mat = PyMem_Malloc( self->rowSize * self->colSize *
|
||||
sizeof( float ) );
|
||||
if( mat == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError
|
||||
( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
Mat4Adj( ( float ( * )[4] ) mat, *self->matrix );
|
||||
}
|
||||
//divide by determinate
|
||||
@@ -351,6 +397,12 @@ PyObject *Matrix_Invert( MatrixObject * self )
|
||||
t = self->matrix[1][0];
|
||||
self->matrix[1][0] = self->matrix[0][1];
|
||||
self->matrix[0][1] = t;
|
||||
|
||||
/*
|
||||
Note: is the code below correct?
|
||||
transposing mat and not copying into self->matrix?
|
||||
s. swaney 11-oct-2004
|
||||
*/
|
||||
} else if( self->rowSize == 3 ) {
|
||||
Mat3Transp( ( float ( * )[3] ) mat );
|
||||
} else if( self->rowSize == 4 ) {
|
||||
@@ -359,7 +411,7 @@ PyObject *Matrix_Invert( MatrixObject * self )
|
||||
} else {
|
||||
printf( "matrix does not have an inverse - none attempted\n" );
|
||||
}
|
||||
|
||||
PyMem_Free( mat );
|
||||
return EXPP_incr_ret( Py_None );
|
||||
}
|
||||
|
||||
@@ -449,8 +501,10 @@ PyObject *Matrix_Identity( MatrixObject * self )
|
||||
|
||||
static void Matrix_dealloc( MatrixObject * self )
|
||||
{
|
||||
PyMem_Free( self->contigPtr );
|
||||
PyMem_Free( self->matrix );
|
||||
PyMem_DEL( self );
|
||||
|
||||
PyObject_DEL( self );
|
||||
}
|
||||
|
||||
static PyObject *Matrix_getattr( MatrixObject * self, char *name )
|
||||
@@ -510,6 +564,10 @@ static PyObject *Matrix_item( MatrixObject * self, int i )
|
||||
"matrix row index out of range\n" );
|
||||
|
||||
vec = PyMem_Malloc( self->colSize * sizeof( float ) );
|
||||
if( vec == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating vec\n\n" ) );
|
||||
}
|
||||
for( x = 0; x < self->colSize; x++ ) {
|
||||
vec[x] = self->matrix[i][x];
|
||||
}
|
||||
@@ -631,7 +689,10 @@ PyObject *Matrix_add( PyObject * m1, PyObject * m2 )
|
||||
matSize = rowSize * colSize;
|
||||
|
||||
mat = PyMem_Malloc( matSize * sizeof( float ) );
|
||||
|
||||
if( mat == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
for( x = 0; x < rowSize; x++ ) {
|
||||
for( y = 0; y < colSize; y++ ) {
|
||||
mat[( ( x * rowSize ) + y )] =
|
||||
@@ -670,7 +731,10 @@ PyObject *Matrix_sub( PyObject * m1, PyObject * m2 )
|
||||
matSize = rowSize * colSize;
|
||||
|
||||
mat = PyMem_Malloc( matSize * sizeof( float ) );
|
||||
|
||||
if( mat == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
for( x = 0; x < rowSize; x++ ) {
|
||||
for( y = 0; y < colSize; y++ ) {
|
||||
mat[( ( x * rowSize ) + y )] =
|
||||
@@ -714,7 +778,10 @@ PyObject *Matrix_mul( PyObject * m1, PyObject * m2 )
|
||||
"Matrix dimension error during scalar multiplication\n" );
|
||||
|
||||
mat = PyMem_Malloc( matSizeV * sizeof( float ) );
|
||||
|
||||
if( mat == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
for( x = 0; x < rowSizeV; x++ ) {
|
||||
for( y = 0; y < colSizeV; y++ ) {
|
||||
mat[( ( x * rowSizeV ) + y )] =
|
||||
@@ -731,7 +798,10 @@ PyObject *Matrix_mul( PyObject * m1, PyObject * m2 )
|
||||
|
||||
mat = PyMem_Malloc( ( rowSizeV * colSizeW ) *
|
||||
sizeof( float ) );
|
||||
|
||||
if( mat == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
for( x = 0; x < rowSizeV; x++ ) {
|
||||
for( y = 0; y < colSizeW; y++ ) {
|
||||
for( z = 0; z < colSizeV; z++ ) {
|
||||
@@ -773,9 +843,20 @@ int Matrix_coerce( PyObject ** m1, PyObject ** m2 )
|
||||
if( PyInt_Check( *m2 ) ) { //it's a int
|
||||
tempI = PyMem_Malloc( 1 *
|
||||
sizeof( long ) );
|
||||
if( tempI == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError
|
||||
( PyExc_MemoryError,
|
||||
"problem allocating tempI\n\n" ) );
|
||||
}
|
||||
*tempI = PyInt_AsLong( *m2 );
|
||||
mat = PyMem_Malloc( matSize *
|
||||
sizeof( float ) );
|
||||
if( mat == NULL ) {
|
||||
PyMem_Free( tempI );
|
||||
return ( EXPP_ReturnPyObjError
|
||||
( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
for( x = 0; x < matSize; x++ ) {
|
||||
mat[x] = ( float ) *tempI;
|
||||
}
|
||||
@@ -790,9 +871,20 @@ int Matrix_coerce( PyObject ** m1, PyObject ** m2 )
|
||||
tempF = PyMem_Malloc( 1 *
|
||||
sizeof
|
||||
( double ) );
|
||||
if( tempF == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError
|
||||
( PyExc_MemoryError,
|
||||
"problem allocating tempF\n\n" ) );
|
||||
}
|
||||
*tempF = PyFloat_AsDouble( *m2 );
|
||||
mat = PyMem_Malloc( matSize *
|
||||
sizeof( float ) );
|
||||
if( mat == NULL ) {
|
||||
PyMem_Free( tempF );
|
||||
return ( EXPP_ReturnPyObjError
|
||||
( PyExc_MemoryError,
|
||||
"problem allocating mat\n\n" ) );
|
||||
}
|
||||
for( x = 0; x < matSize; x++ ) {
|
||||
mat[x] = ( float ) *tempF;
|
||||
}
|
||||
@@ -858,7 +950,7 @@ static PyNumberMethods Matrix_NumMethods = {
|
||||
};
|
||||
|
||||
PyTypeObject matrix_Type = {
|
||||
PyObject_HEAD_INIT( NULL )
|
||||
PyObject_HEAD_INIT( NULL ) /* required python macro */
|
||||
0, /*ob_size */
|
||||
"Matrix", /*tp_name */
|
||||
sizeof( MatrixObject ), /*tp_basicsize */
|
||||
@@ -879,7 +971,6 @@ PyTypeObject matrix_Type = {
|
||||
PyObject *newMatrixObject( float *mat, int rowSize, int colSize )
|
||||
{
|
||||
MatrixObject *self;
|
||||
float *contigPtr;
|
||||
int row, col, x;
|
||||
|
||||
if( rowSize < 2 || rowSize > 4 || colSize < 2 || colSize > 4 )
|
||||
@@ -889,20 +980,21 @@ PyObject *newMatrixObject( float *mat, int rowSize, int colSize )
|
||||
self = PyObject_NEW( MatrixObject, &matrix_Type );
|
||||
|
||||
//generate contigous memory space
|
||||
contigPtr = PyMem_Malloc( rowSize * colSize * sizeof( float ) );
|
||||
if( contigPtr == NULL ) {
|
||||
self->contigPtr = PyMem_Malloc( rowSize * colSize * sizeof( float ) );
|
||||
if( self->contigPtr == NULL ) {
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating array space\n\n" ) );
|
||||
}
|
||||
//create pointer array
|
||||
self->matrix = PyMem_Malloc( rowSize * sizeof( float * ) );
|
||||
if( self->matrix == NULL ) {
|
||||
PyMem_Free( self->contigPtr );
|
||||
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
||||
"problem allocating pointer space\n\n" ) );
|
||||
}
|
||||
//pointer array points to contigous memory
|
||||
for( x = 0; x < rowSize; x++ ) {
|
||||
self->matrix[x] = contigPtr + ( x * colSize );
|
||||
self->matrix[x] = self->contigPtr + ( x * colSize );
|
||||
}
|
||||
|
||||
if( mat ) { //if a float array passed
|
||||
|
||||
@@ -49,7 +49,9 @@
|
||||
typedef float **ptRow;
|
||||
|
||||
typedef struct _Matrix {
|
||||
PyObject_VAR_HEAD ptRow matrix;
|
||||
PyObject_VAR_HEAD /* standard python macro */
|
||||
ptRow matrix;
|
||||
float *contigPtr;
|
||||
int rowSize;
|
||||
int colSize;
|
||||
int flag;
|
||||
|
||||
Reference in New Issue
Block a user