Coverity: umfpack and uidata memory leaks fixed 38/18038/5
Dhruv Khattar [Mon, 4 Apr 2016 22:15:53 +0000 (03:15 +0530)]
Change-Id: Ie9df4b49d51c4cc49ded8b4ee9688feda8874782

scilab/modules/ui_data/sci_gateway/cpp/sci_editvar.cpp
scilab/modules/umfpack/sci_gateway/c/sci_res_with_prec.c
scilab/modules/umfpack/sci_gateway/c/sci_taucs_chget.c
scilab/modules/umfpack/sci_gateway/c/sci_taucs_chsolve.c
scilab/modules/umfpack/sci_gateway/c/sci_umf_luget.c
scilab/modules/umfpack/sci_gateway/c/sci_umf_lusolve.c
scilab/modules/umfpack/sci_gateway/c/sci_umfpack.c

index 2e4c8f3..50b9176 100644 (file)
@@ -199,7 +199,7 @@ int sci_editvar(char * fname, void* pvApiCtx)
     if (strcmp(pStVarOne, "ans") == 0)
     {
         Scierror(999, _("%s: ans cannot be edited.\n"), fname);
-        FREE(pStVarOne);
+        freeAllocatedSingleString(pStVarOne);
         return 0;
     }
 
@@ -208,7 +208,7 @@ int sci_editvar(char * fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         Scierror(4, _("%s: Undefined variable: %s.\n"), fname, pStVarOne);
-        FREE(pStVarOne);
+        freeAllocatedSingleString(pStVarOne);
         return 0;
     }
 
@@ -239,7 +239,7 @@ int sci_editvar(char * fname, void* pvApiCtx)
             strcmp(pStVarOne, "TMPDIR")        == 0 )
     {
         Scierror(13, _("Redefining permanent variable.\n"), fname);
-        FREE(pStVarOne);
+        freeAllocatedSingleString(pStVarOne);
         return 0;
     }
 
@@ -250,7 +250,7 @@ int sci_editvar(char * fname, void* pvApiCtx)
         if (sciErr.iErr)
         {
             Scierror(4, _("%s: Undefined variable: %s.\n"), fname, pStVarOne);
-            FREE(pStVarOne);
+            freeAllocatedSingleString(pStVarOne);
             return 0;
         }
     }
@@ -259,9 +259,9 @@ int sci_editvar(char * fname, void* pvApiCtx)
         sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr);
         if (sciErr.iErr)
         {
-            FREE(pStVarOne);
             printError(&sciErr, 0);
             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
+            freeAllocatedSingleString(pStVarOne);
             return 0;
         }
     }
@@ -273,23 +273,23 @@ int sci_editvar(char * fname, void* pvApiCtx)
         {
             printError(&sciErr, 0);
             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 3);
-            FREE(pStVarOne);
+            freeAllocatedSingleString(pStVarOne);
             return 0;
         }
 
         if (!isDoubleType(pvApiCtx, addr))
         {
             Scierror(999, _("%s: Wrong type for input argument #%d: Double expected.\n"), fname, 3);
-            FREE(pStVarOne);
+            freeAllocatedSingleString(pStVarOne);
             return 0;
         }
 
         sciErr = getMatrixOfDouble(pvApiCtx, addr, &iRows, &iCols, &rowsIndex);
         if (sciErr.iErr)
         {
-            FREE(pStVarOne);
             printError(&sciErr, 0);
             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 3);
+            freeAllocatedSingleString(pStVarOne);
             return 0;
         }
 
@@ -300,23 +300,23 @@ int sci_editvar(char * fname, void* pvApiCtx)
         {
             printError(&sciErr, 0);
             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 4);
-            FREE(pStVarOne);
+            freeAllocatedSingleString(pStVarOne);
             return 0;
         }
 
         if (!isDoubleType(pvApiCtx, addr))
         {
             Scierror(999, _("%s: Wrong type for input argument #%d: Double expected.\n"), fname, 4);
-            FREE(pStVarOne);
+            freeAllocatedSingleString(pStVarOne);
             return 0;
         }
 
         sciErr = getMatrixOfDouble(pvApiCtx, addr, &iRows, &iCols, &colsIndex);
         if (sciErr.iErr)
         {
-            FREE(pStVarOne);
             printError(&sciErr, 0);
             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 4);
+            freeAllocatedSingleString(pStVarOne);
             return 0;
         }
 
@@ -329,9 +329,9 @@ int sci_editvar(char * fname, void* pvApiCtx)
     sciErr = getVarType(pvApiCtx, piAddr, &iType);
     if (sciErr.iErr)
     {
-        FREE(pStVarOne);
         printError(&sciErr, 0);
         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+        freeAllocatedSingleString(pStVarOne);
         return 0;
     }
 
@@ -349,9 +349,9 @@ int sci_editvar(char * fname, void* pvApiCtx)
                 sciErr = getComplexMatrixOfDouble(pvApiCtx, piAddr, &iRows, &iCols, &pdblReal, &pdblImg);
                 if (sciErr.iErr)
                 {
-                    FREE(pStVarOne);
                     printError(&sciErr, 0);
                     Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                    freeAllocatedSingleString(pStVarOne);
                     return 0;
                 }
 
@@ -403,9 +403,9 @@ int sci_editvar(char * fname, void* pvApiCtx)
                 sciErr = getMatrixOfDouble(pvApiCtx, piAddr, &iRows, &iCols, &pdblReal);
                 if (sciErr.iErr)
                 {
-                    FREE(pStVarOne);
                     printError(&sciErr, 0);
                     Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                    freeAllocatedSingleString(pStVarOne);
                     return 0;
                 }
                 /*
@@ -440,9 +440,9 @@ int sci_editvar(char * fname, void* pvApiCtx)
             //retrieve data
             if (getAllocatedMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, &pstData))
             {
-                FREE(pStVarOne);
                 printError(&sciErr, 0);
                 Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                freeAllocatedSingleString(pStVarOne);
                 return 0;
             }
 
@@ -480,9 +480,9 @@ int sci_editvar(char * fname, void* pvApiCtx)
             sciErr = getMatrixOfBoolean(pvApiCtx, piAddr, &iRows, &iCols, &piBool);
             if (sciErr.iErr)
             {
-                FREE(pStVarOne);
                 printError(&sciErr, 0);
                 Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                freeAllocatedSingleString(pStVarOne);
                 return 0;
             }
 
@@ -519,9 +519,9 @@ int sci_editvar(char * fname, void* pvApiCtx)
             sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddr, &prec);
             if (sciErr.iErr)
             {
-                FREE(pStVarOne);
                 printError(&sciErr, 0);
                 Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                freeAllocatedSingleString(pStVarOne);
                 return 0;
             }
 
@@ -533,6 +533,7 @@ int sci_editvar(char * fname, void* pvApiCtx)
                     {
                         printError(&sciErr, 0);
                         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                        freeAllocatedSingleString(pStVarOne);
                         return -1;
                     }
 
@@ -565,6 +566,7 @@ int sci_editvar(char * fname, void* pvApiCtx)
                     {
                         printError(&sciErr, 0);
                         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                        freeAllocatedSingleString(pStVarOne);
                         return -1;
                     }
 
@@ -597,6 +599,7 @@ int sci_editvar(char * fname, void* pvApiCtx)
                     {
                         printError(&sciErr, 0);
                         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                        freeAllocatedSingleString(pStVarOne);
                         return -1;
                     }
 
@@ -629,6 +632,7 @@ int sci_editvar(char * fname, void* pvApiCtx)
                     {
                         printError(&sciErr, 0);
                         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                        freeAllocatedSingleString(pStVarOne);
                         return -1;
                     }
 
@@ -661,6 +665,7 @@ int sci_editvar(char * fname, void* pvApiCtx)
                     {
                         printError(&sciErr, 0);
                         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                        freeAllocatedSingleString(pStVarOne);
                         return -1;
                     }
 
@@ -693,6 +698,7 @@ int sci_editvar(char * fname, void* pvApiCtx)
                     {
                         printError(&sciErr, 0);
                         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                        freeAllocatedSingleString(pStVarOne);
                         return -1;
                     }
 
@@ -720,8 +726,8 @@ int sci_editvar(char * fname, void* pvApiCtx)
                     break;
 
                 default :
-
                     Scierror(42, _("%s: Type not handle yet"), fname);
+                    freeAllocatedSingleString(pStVarOne);
                     return 0;
             }
 
@@ -731,9 +737,9 @@ int sci_editvar(char * fname, void* pvApiCtx)
             sciErr = getBooleanSparseMatrix(pvApiCtx, piAddr, &iRows, &iCols, &piNbItem, &piNbItemRow, &piColPos);
             if (sciErr.iErr)
             {
-                FREE(pStVarOne);
                 printError(&sciErr, 0);
                 Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                freeAllocatedSingleString(pStVarOne);
                 return 0;
             }
 
@@ -764,9 +770,9 @@ int sci_editvar(char * fname, void* pvApiCtx)
                 sciErr = getComplexSparseMatrix(pvApiCtx, piAddr, &iRows, &iCols, &piNbItem, &piNbItemRow, &piColPos, &pdblReal, &pdblImg);
                 if (sciErr.iErr)
                 {
-                    FREE(pStVarOne);
                     printError(&sciErr, 0);
                     Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                    freeAllocatedSingleString(pStVarOne);
                     return 0;
                 }
 
@@ -798,9 +804,9 @@ int sci_editvar(char * fname, void* pvApiCtx)
                 sciErr = getSparseMatrix(pvApiCtx, piAddr, &iRows, &iCols, &piNbItem, &piNbItemRow, &piColPos, &pdblReal);
                 if (sciErr.iErr)
                 {
-                    FREE(pStVarOne);
                     printError(&sciErr, 0);
                     Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                    freeAllocatedSingleString(pStVarOne);
                     return 0;
                 }
 
@@ -827,12 +833,14 @@ int sci_editvar(char * fname, void* pvApiCtx)
             }
             break;
         default:
-
             Scierror(42, _("%s: Type not handle yet"), fname);
+            freeAllocatedSingleString(pStVarOne);
             return 0;
     }
 
-    FREE(pStVarOne);
+    freeAllocatedSingleString(pStVarOne);
+    FREE(piColPos);
+    FREE(piNbItemRow);
 
     LhsVar(1) = 0;
     PutLhsVar();
index e72dfa3..a27ffc5 100644 (file)
@@ -237,17 +237,17 @@ int sci_res_with_prec(char* fname, void* pvApiCtx)
         }
     }
 
-    if (isVarComplex(pvApiCtx, piAddr1) == 0)
+    if (pdblNI)
     {
         FREE(pdblNI);
     }
 
-    if (isVarComplex(pvApiCtx, piAddr2) == 0)
+    if (pdblXI)
     {
         FREE(pdblXI);
     }
 
-    if (isVarComplex(pvApiCtx, piAddr3) == 0)
+    if (pdblBI)
     {
         FREE(pdblBI);
     }
index 81493f1..c8c4b66 100644 (file)
@@ -104,6 +104,7 @@ int sci_taucs_chget(char* fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        taucs_ccs_free(C);
         return 1;
     }
 
@@ -112,6 +113,7 @@ int sci_taucs_chget(char* fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        taucs_ccs_free(C);
         return 1;
     }
 
index 816b009..813739c 100644 (file)
@@ -185,9 +185,6 @@ int sci_taucs_chsolve(char* fname, void* pvApiCtx)
         return 1;
     }
 
-    /* allocate memory for a temporary vector v */
-    pdblV = (double*)MALLOC(mb * sizeof(double));
-
     if (Refinement)
     {
         pdblRes = (double*)MALLOC(mb * sizeof(double));
@@ -195,11 +192,18 @@ int sci_taucs_chsolve(char* fname, void* pvApiCtx)
         {
             if ( (wk = (long double*)MALLOC( n * sizeof(long double))) == NULL )
             {
+                if (pdblRes)
+                {
+                    FREE(pdblRes);
+                }
                 Scierror(999, _("%s: not enough memory.\n"), fname);
                 return 1;
             }
         }
     }
+    
+    /* allocate memory for a temporary vector v */
+    pdblV = (double*)MALLOC(mb * sizeof(double));
 
     for (j = 0; j < nb ; j++)
     {
index 7c0df2f..716d6be 100644 (file)
@@ -232,6 +232,8 @@ int sci_umf_luget(char* fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        FREE(L_mnel);
+        FREE(U_mnel);
         return 1;
     }
 
@@ -248,6 +250,8 @@ int sci_umf_luget(char* fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        FREE(L_mnel);
+        FREE(U_mnel);
         return 1;
     }
 
@@ -256,6 +260,8 @@ int sci_umf_luget(char* fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        FREE(L_mnel);
+        FREE(U_mnel);
         return 1;
     }
 
@@ -264,6 +270,8 @@ int sci_umf_luget(char* fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        FREE(L_mnel);
+        FREE(U_mnel);
         return 1;
     }
 
@@ -272,6 +280,8 @@ int sci_umf_luget(char* fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        FREE(L_mnel);
+        FREE(U_mnel);
         return 1;
     }
 
index 0be9c35..1163bb6 100644 (file)
@@ -230,7 +230,11 @@ int sci_umf_lusolve(char* fname, void* pvApiCtx)
             return 1;
         }
 
-        getAllocatedSingleString(pvApiCtx, piAddr3, &pStr);
+        if (getAllocatedSingleString(pvApiCtx, piAddr3, &pStr))
+        {
+            return 0;
+        }
+
         if (strcmp(pStr, "Ax=b") == 0)
         {
             NoTranspose = 1;
@@ -242,8 +246,11 @@ int sci_umf_lusolve(char* fname, void* pvApiCtx)
         else
         {
             Scierror(999, _("%s: Wrong input argument #%d: '%s' or '%s' expected.\n"), fname, 3, "Ax=b", "A'x=b");
+            freeAllocatedSingleString(pStr);
             return 1;
         }
+        
+        freeAllocatedSingleString(pStr);
 
         if (nbInputArgument(pvApiCtx) == 4)
         {
index 77e9711..9a4b931 100644 (file)
@@ -255,9 +255,6 @@ int sci_umfpack(char* fname, void* pvApiCtx)
         return 1;
     }
 
-    /* allocate memory for umfpack_di_wsolve usage or umfpack_zi_wsolve usage*/
-    Wi = (int*)MALLOC(mA * sizeof(int));
-
     if (A.it == 1)
     {
         mW = 10 * mA;
@@ -267,8 +264,6 @@ int sci_umfpack(char* fname, void* pvApiCtx)
         mW = 5 * mA;
     }
 
-    W = (double*)MALLOC(mW * sizeof(double));
-
     if (A.it == 1  &&  pdblBI == NULL)
     {
         int iSize = mb * nb * sizeof(double);
@@ -325,7 +320,10 @@ int sci_umfpack(char* fname, void* pvApiCtx)
         Scierror(999, _("%s: An error occurred: %s: %s\n"), fname, _("numeric factorization"), UmfErrorMes(stat));
         return 1;
     }
-
+    
+    /* allocate memory for umfpack_di_wsolve usage or umfpack_zi_wsolve usage*/
+    Wi = (int*)MALLOC(mA * sizeof(int));
+    W = (double*)MALLOC(mW * sizeof(double));
 
     if ( Case == 1 )   /*  x = A\b  <=> Ax = b */
     {