Coverity #1321383, #1321384, #1321385, 1321386 fixed: Resource Leaks 50/17950/5
Dhruv Khattar [Mon, 21 Mar 2016 19:57:30 +0000 (00:57 +0530)]
Change-Id: Id2358f122ef3a914c3d61eb3109d36a70fe4c5df

scilab/modules/api_scilab/src/cpp/api_stack_boolean_sparse.cpp

index 960f039..64e8b8b 100644 (file)
@@ -203,18 +203,32 @@ SciErr createNamedBooleanSparseMatrix(void* _pvCtx, const char* _pstName, int _i
 SciErr readNamedBooleanSparseMatrix(void* _pvCtx, const char* _pstName, int* _piRows, int* _piCols, int* _piNbItem, int* _piNbItemRow, int* _piColPos)
 {
     SciErr sciErr       = sciErrInit();
-    int* piAddr         = NULL;
-    int* piNbItemRow    = 0;
-    int* piColPos       = 0;
-
-    sciErr = getVarAddressFromName(_pvCtx, _pstName, &piAddr);
+    struct Attr
+    {
+        public:
+            int *piAddr;
+            int *piNbItemRow;
+            int *piColPos;
+            Attr() : piAddr(NULL), piNbItemRow(NULL), piColPos(NULL) {}
+            ~Attr()
+            {
+                if(piNbItemRow)
+                    FREE(piNbItemRow);
+                if(piColPos)
+                    FREE(piColPos);
+                if(piAddr)
+                    FREE(piAddr);
+            }
+    };
+    struct Attr attr;
+    sciErr = getVarAddressFromName(_pvCtx, _pstName, &attr.piAddr);
     if (sciErr.iErr)
     {
         addErrorMessage(&sciErr, API_ERROR_READ_NAMED_BOOLEAN_SPARSE, _("%s: Unable to get variable \"%s\""), "readNamedBooleanSparseMatrix", _pstName);
         return sciErr;
     }
 
-    sciErr = getBooleanSparseMatrix(_pvCtx, piAddr, _piRows, _piCols, _piNbItem, &piNbItemRow, &piColPos);
+    sciErr = getBooleanSparseMatrix(_pvCtx, attr.piAddr, _piRows, _piCols, _piNbItem, &attr.piNbItemRow, &attr.piColPos);
     if (sciErr.iErr)
     {
         addErrorMessage(&sciErr, API_ERROR_READ_NAMED_BOOLEAN_SPARSE, _("API_ERROR_READ_NAMED_BOOLEAN_SPARSE"));
@@ -226,14 +240,14 @@ SciErr readNamedBooleanSparseMatrix(void* _pvCtx, const char* _pstName, int* _pi
         return sciErr;
     }
 
-    memcpy(_piNbItemRow, piNbItemRow, *_piRows * sizeof(int));
+    memcpy(_piNbItemRow, attr.piNbItemRow, *_piRows * sizeof(int));
 
     if (_piColPos == NULL)
     {
         return sciErr;
     }
 
-    memcpy(_piColPos, piColPos, *_piNbItem * sizeof(int));
+    memcpy(_piColPos, attr.piColPos, *_piNbItem * sizeof(int));
     return sciErr;
 }
 /*--------------------------------------------------------------------------*/
@@ -258,6 +272,8 @@ int getAllocatedBooleanSparseMatrix(void* _pvCtx, int* _piAddress, int* _piRows,
     {
         addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_BOOLEAN_SPARSE, _("%s: Unable to get argument #%d"), "getAllocatedBooleanSparseMatrix", getRhsFromAddress(_pvCtx, _piAddress));
         printError(&sciErr, 0);
+        FREE(piNbItemRow);
+        FREE(piColPos);
         return sciErr.iErr;
     }