Coverity #1098598, #1098599, #1098603 fixed: Resource Leaks 87/18087/7
Dhruv Khattar [Fri, 15 Apr 2016 19:05:37 +0000 (00:05 +0530)]
Change-Id: I13cff25c7635879661d16b0c10fc150a6e7406b8

scilab/modules/arnoldi/sci_gateway/c/sci_eigs.c

index d8dc702..5a7cff3 100644 (file)
 #include "sci_malloc.h"
 #include "eigs.h"
 
+#define FREE_AB \
+    if (isVarComplex(pvApiCtx, piAddressVarOne) && !isVarComplex(pvApiCtx, piAddressVarTwo)) FREE(Bcplx);   \
+    if (!isVarComplex(pvApiCtx, piAddressVarOne) && isVarComplex(pvApiCtx, piAddressVarTwo)) FREE(Acplx);
+
+#define FREE_PSTDATA \
+    if (iTypeVarFour == sci_strings) freeAllocatedSingleString(pstData);
+
 int sci_eigs(char *fname, void* pvApiCtx)
 {
     SciErr sciErr;
@@ -62,7 +69,6 @@ int sci_eigs(char *fname, void* pvApiCtx)
     int iTypeVarFour           = 0;
     int iRowsFour                      = 0;
     int iColsFour                      = 0;
-    int iLen                           = 0;
     char* pstData                      = NULL;
     doublecomplex SIGMA;
 
@@ -232,7 +238,7 @@ int sci_eigs(char *fname, void* pvApiCtx)
     {
         printError(&sciErr, 0);
         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 3);
-        FREE(Acplx);
+        FREE_AB;
         return 1;
     }
 
@@ -240,24 +246,28 @@ int sci_eigs(char *fname, void* pvApiCtx)
     if (iErr)
     {
         Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "eigs", 3);
+        FREE_AB;
         return 1;
     }
 
     if (isVarComplex(pvApiCtx, piAddressVarThree))
     {
         Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "eigs", 3);
+        FREE_AB;
         return 1;
     }
 
     if (dblNEV != floor(dblNEV) || (dblNEV <= 0))
     {
         Scierror(999, _("%s: Wrong type for input argument #%d: k must be a positive integer.\n"), "eigs", 3);
+        FREE_AB;
         return 1;
     }
 
     if (!finite(dblNEV))
     {
         Scierror(999, _("%s: Wrong value for input argument #%d: k must be in the range 1 to N.\n"), "eigs", 3);
+        FREE_AB;
         return 1;
     }
 
@@ -272,6 +282,7 @@ int sci_eigs(char *fname, void* pvApiCtx)
     {
         printError(&sciErr, 0);
         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 4);
+        FREE_AB;
         return 1;
     }
 
@@ -279,6 +290,7 @@ int sci_eigs(char *fname, void* pvApiCtx)
     if (sciErr.iErr || (iTypeVarFour != sci_matrix && iTypeVarFour != sci_strings))
     {
         Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "eigs", 4);
+        FREE_AB;
         return 1;
     }
 
@@ -287,6 +299,7 @@ int sci_eigs(char *fname, void* pvApiCtx)
         int iErr = getAllocatedSingleString(pvApiCtx, piAddressVarFour, &pstData);
         if (iErr)
         {
+            FREE_AB;
             return 1;
         }
 
@@ -297,12 +310,15 @@ int sci_eigs(char *fname, void* pvApiCtx)
             {
                 Scierror(999, _("%s: Wrong value for input argument #%d: Unrecognized sigma value.\n Sigma must be one of '%s', '%s', '%s', '%s' or '%s'.\n" ),
                          "eigs", 4, "LM", "SM", "LA", "SA", "BE");
+                freeAllocatedSingleString(pstData);
                 return 1;
             }
             else
             {
                 Scierror(999, _("%s: Wrong value for input argument #%d: Unrecognized sigma value.\n Sigma must be one of '%s', '%s', '%s', '%s', '%s' or '%s'.\n " ),
                          "eigs", 4, "LM", "SM", "LR", "SR", "LI", "SI");
+                FREE_AB;
+                freeAllocatedSingleString(pstData);
                 return 1;
             }
         }
@@ -310,12 +326,15 @@ int sci_eigs(char *fname, void* pvApiCtx)
         if ((Acomplex || !Asym) && (strcmp(pstData, "LA") == 0 || strcmp(pstData, "SA") == 0 || strcmp(pstData, "BE") == 0))
         {
             Scierror(999, _("%s: Invalid sigma value for complex or non symmetric problem.\n"), "eigs", 4);
+            FREE_AB;
+            freeAllocatedSingleString(pstData);
             return 1;
         }
 
         if (!Acomplex && Asym && (strcmp(pstData, "LR") == 0 || strcmp(pstData, "SR") == 0 || strcmp(pstData, "LI") == 0 || strcmp(pstData, "SI") == 0))
         {
             Scierror(999, _("%s: Invalid sigma value for real symmetric problem.\n"), "eigs", 4);
+            freeAllocatedSingleString(pstData);
             return 1;
         }
 
@@ -329,6 +348,7 @@ int sci_eigs(char *fname, void* pvApiCtx)
         if (iRowsFour * iColsFour != 1)
         {
             Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "eigs", 4);
+            FREE_AB;
             return 1;
         }
 
@@ -336,12 +356,14 @@ int sci_eigs(char *fname, void* pvApiCtx)
         {
             printError(&sciErr, 0);
             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 4);
+            FREE_AB;
             return 1;
         }
 
         if (C2F(isanan)(&SIGMA.r) || C2F(isanan)(&SIGMA.i))
         {
             Scierror(999, _("%s: Wrong type for input argument #%d: sigma must be a real.\n"), "eigs", 4);
+            FREE_AB;
             return 1;
         }
 
@@ -356,6 +378,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
     {
         printError(&sciErr, 0);
         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 5);
+        FREE_AB;
+        FREE_PSTDATA;
         return 0;
     }
 
@@ -363,12 +387,16 @@ int sci_eigs(char *fname, void* pvApiCtx)
     if (iErr)
     {
         Scierror(999, _("%s: Wrong type for input argument #%d: %s must be a scalar.\n"), "eigs", 5, "opts.maxiter");
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
 
     if ((dblMAXITER != floor(dblMAXITER)) || (dblMAXITER <= 0))
     {
         Scierror(999, _("%s: Wrong type for input argument #%d: %s must be an integer positive value.\n"), "eigs", 5, "opts.maxiter");
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
 
@@ -380,6 +408,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
     {
         printError(&sciErr, 0);
         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 6);
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
 
@@ -387,12 +417,16 @@ int sci_eigs(char *fname, void* pvApiCtx)
     if (iErr)
     {
         Scierror(999, _("%s: Wrong type for input argument #%d: %s must be a real scalar.\n"), "eigs", 6, "opts.tol");
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
 
     if (C2F(isanan)(&dblTOL))
     {
         Scierror(999, _("%s: Wrong type for input argument #%d: %s must be a real scalar.\n"), "eigs", 6, "opts.tol");
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
 
@@ -404,6 +438,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
     {
         printError(&sciErr, 0);
         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 7);
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
 
@@ -412,6 +448,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
     {
         printError(&sciErr, 0);
         Scierror(999, _("%s: Wrong type for input argument #%d: %s must be an integer scalar.\n"), "eigs", 7, "opts.ncv");
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
     else
@@ -426,6 +464,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
             if (RowsSeven * ColsSeven > 1)
             {
                 Scierror(999, _("%s: Wrong type for input argument #%d: %s must be an integer scalar.\n"), "eigs", 7, "opts.ncv");
+                FREE_AB;
+                FREE_PSTDATA;
                 return 1;
             }
 
@@ -436,12 +476,16 @@ int sci_eigs(char *fname, void* pvApiCtx)
                 {
                     printError(&sciErr, 0);
                     Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 7);
+                    FREE_AB;
+                    FREE_PSTDATA;
                     return 1;
                 }
 
                 if (dblNCV[0] != floor(dblNCV[0]))
                 {
                     Scierror(999, _("%s: Wrong type for input argument #%d: %s must be an integer scalar.\n"), "eigs", 7, "opts.ncv");
+                    FREE_AB;
+                    FREE_PSTDATA;
                     return 1;
                 }
             }
@@ -456,6 +500,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
     {
         printError(&sciErr, 0);
         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 8);
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
 
@@ -463,6 +509,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
     if (sciErr.iErr || (iTypeVarEight != sci_matrix && iTypeVarEight != sci_boolean))
     {
         Scierror(999, _("%s: Wrong type for input argument #%d: %s must be an integer scalar or a boolean.\n"), "eigs", 8, "opts.cholB");
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
 
@@ -472,12 +520,16 @@ int sci_eigs(char *fname, void* pvApiCtx)
         if (iErr)
         {
             Scierror(999, _("%s: Wrong type for input argument #%d: %s must be an integer scalar or a boolean.\n"), "eigs", 8, "opts.cholB");
+            FREE_AB;
+            FREE_PSTDATA;
             return 1;
         }
 
         if (iCHOLB != 1 && iCHOLB != 0)
         {
             Scierror(999, _("%s: Wrong value for input argument #%d: %s must be %s or %s.\n"), "eigs", 8, "opts.cholB", "%f", "%t");
+            FREE_AB;
+            FREE_PSTDATA;
             return 1;
         }
         dblCHOLB = (double) iCHOLB;
@@ -489,12 +541,16 @@ int sci_eigs(char *fname, void* pvApiCtx)
         if (iErr)
         {
             Scierror(999, _("%s: Wrong type for input argument #%d: %s must be an integer scalar or a boolean.\n"), "eigs", 8, "opts.cholB");
+            FREE_AB;
+            FREE_PSTDATA;
             return 1;
         }
 
         if (dblCHOLB != 1 && dblCHOLB != 0)
         {
             Scierror(999, _("%s: Wrong value for input argument #%d: %s must be %s or %s.\n"), "eigs", 8, "opts.cholB", "%f", "%t");
+            FREE_AB;
+            FREE_PSTDATA;
             return 1;
         }
     }
@@ -510,6 +566,7 @@ int sci_eigs(char *fname, void* pvApiCtx)
                     if (i == j && Breal[i + j * N] == 0)
                     {
                         Scierror(999, _("%s: B is not positive definite. Try with sigma='SM' or sigma=scalar.\n"), "eigs");
+                        FREE_PSTDATA;
                         return 0;
                     }
                     else
@@ -517,6 +574,7 @@ int sci_eigs(char *fname, void* pvApiCtx)
                         if ( j < i && Breal[i + j * N] != 0 )
                         {
                             Scierror(999, _("%s: If opts.cholB is true, B should be upper triangular.\n"), "eigs");
+                            FREE_PSTDATA;
                             return 0;
                         }
                     }
@@ -532,6 +590,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
                     if (i == j && Bcplx[i + i * N].r == 0 && Bcplx[i + i * N].i == 0)
                     {
                         Scierror(999, _("%s: B is not positive definite. Try with sigma='SM' or sigma=scalar.\n"), "eigs");
+                        FREE_AB;
+                        FREE_PSTDATA;
                         return 0;
                     }
                     else
@@ -539,6 +599,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
                         if ( j < i && (Bcplx[i + j * N].r != 0 || Bcplx[i + j * N].i != 0) )
                         {
                             Scierror(999, _("%s: If opts.cholB is true, B should be upper triangular.\n"), "eigs");
+                            FREE_AB;
+                            FREE_PSTDATA;
                             return 0;
                         }
                     }
@@ -555,6 +617,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
     {
         printError(&sciErr, 0);
         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 9);
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
 
@@ -563,6 +627,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
     {
         printError(&sciErr, 0);
         Scierror(999, _("%s: Wrong type for input argument #%d: A real or complex matrix expected.\n"), "eigs", 9);
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
     else
@@ -571,6 +637,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
         if (iRowsNine * iColsNine == 1 || iRowsNine * iColsNine != N)
         {
             Scierror(999, _("%s: Wrong dimension for input argument #%d: Start vector %s must be N by 1.\n"), "eigs", 9, "opts.resid");
+            FREE_AB;
+            FREE_PSTDATA;
             return 1;
         }
     }
@@ -580,6 +648,7 @@ int sci_eigs(char *fname, void* pvApiCtx)
         if (isVarComplex(pvApiCtx, piAddressVarNine))
         {
             Scierror(999, _("%s: Wrong type for input argument #%d: Start vector %s must be real for real problems.\n"), "eigs", 9, "opts.resid");
+            FREE_PSTDATA;
             return 1;
         }
         else
@@ -589,6 +658,7 @@ int sci_eigs(char *fname, void* pvApiCtx)
             {
                 printError(&sciErr, 0);
                 Scierror(999, _("%s: Can not read input argument #%d.\n"), "eigs", 9);
+                FREE_PSTDATA;
                 return 1;
             }
         }
@@ -600,6 +670,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
         {
             printError(&sciErr, 0);
             Scierror(999, _("%s: Can not read input argument #%d.\n"), "eigs", 9);
+            FREE_AB;
+            FREE_PSTDATA;
             return 1;
         }
     }
@@ -612,6 +684,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
     {
         printError(&sciErr, 0);
         Scierror(999, _("%s: Can not read input argument #%d.\n"), "eigs", 9);
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
 
@@ -619,6 +693,8 @@ int sci_eigs(char *fname, void* pvApiCtx)
     if (iErr)
     {
         Scierror(999, _("%s: Wrong type for input argument #%d: An integer expected.\n"), "eigs", 1);
+        FREE_AB;
+        FREE_PSTDATA;
         return 1;
     }
 
@@ -647,6 +723,9 @@ int sci_eigs(char *fname, void* pvApiCtx)
     error = eigs(Areal, Acplx, N, Acomplex, Asym, Breal, Bcplx, Bcomplex, matB, iNEV, SIGMA, pstData, &dblMAXITER,
                  &dblTOL, dblNCV, RESID, RESIDC, &iINFO, &dblCHOLB, INFO_EUPD, eigenvalue, eigenvector, eigenvalueC, eigenvectorC, RVEC);
 
+    FREE_AB;
+    FREE_PSTDATA;
+
     switch (error)
     {
         case -1 :
@@ -822,23 +901,6 @@ int sci_eigs(char *fname, void* pvApiCtx)
         AssignOutputVariable(pvApiCtx, 2) = nbInputArgument(pvApiCtx) + 2;
     }
 
-    if (iTypeVarFour == sci_strings)
-    {
-        freeAllocatedSingleString(pstData);
-    }
-
-    if (matB != 0)
-    {
-        if (Acomplex && !Bcomplex)
-        {
-            FREE(Bcplx);
-        }
-        if (!Acomplex && Bcomplex)
-        {
-            FREE(Acplx);
-        }
-    }
-
     ReturnArguments(pvApiCtx);
     return 0;
 }