Coverity: fftw module memory errors fixed 19/18319/3
Dhruv Khattar [Tue, 28 Jun 2016 22:14:11 +0000 (03:14 +0530)]
Change-Id: I89e56b8953e261015487f139af9cc767222831d0

scilab/modules/fftw/sci_gateway/c/sci_fftw_flags.c
scilab/modules/fftw/sci_gateway/cpp/sci_fftw.cpp
scilab/modules/fftw/src/c/fftw_utilities.c
scilab/modules/fftw/src/cpp/fftw_common.cpp

index 4ea38bd..dca148d 100644 (file)
@@ -302,6 +302,7 @@ int sci_fftw_flags(char *fname,  void* pvApiCtx)
         if (Str3[0] == NULL)
         {
             Scierror(999, _("%s: No more memory.\n"), fname);
+            FREE(Str3);
             return 1;
         }
     }
@@ -322,7 +323,7 @@ int sci_fftw_flags(char *fname,  void* pvApiCtx)
                     Str3 = (char **)MALLOC(sizeof(char *) * j);
                 }
 
-                if ( Str3 == NULL)
+                if (Str3 == NULL)
                 {
                     Scierror(999, _("%s: No more memory.\n"), fname);
                     return 1;
@@ -331,14 +332,20 @@ int sci_fftw_flags(char *fname,  void* pvApiCtx)
                 Str3[j - 1] = os_strdup(Str[i]);
                 if (Str3[j - 1] == NULL)
                 {
-                    freeArrayOfString(Str3, j);
                     Scierror(999, _("%s: No more memory.\n"), fname);
+                    freeArrayOfString(Str3, j);
                     return 1;
                 }
             }
         }
     }
 
+    if (Str3 == NULL)
+    {
+        Scierror(999, _("%s: Failed to generate the planner name.\n"), fname);
+        return 1;
+    }
+
     /* Create the string matrix as return of the function */
     sciErr = createMatrixOfString(pvApiCtx, nbInputArgument(pvApiCtx) + 3, j, 1, Str3);
     freeArrayOfString(Str3, j); // Data have been copied into Scilab memory
index c72a1d4..9f41fa1 100644 (file)
@@ -248,11 +248,8 @@ int sci_fft_gen(const char *fname, types::Double* A, types::Double** O, int isn,
                 Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
             }
 
-            if (*O)
-            {
-                delete (*O);
-                (*O) = NULL;
-            }
+            delete (*O);
+            (*O) = NULL;
 
             if (tmp)
             {
@@ -300,11 +297,8 @@ int sci_fft_gen(const char *fname, types::Double* A, types::Double** O, int isn,
             FREE(dims1);
             FREE(incr1);
 
-            if (*O)
-            {
-                delete (*O);
-                (*O) = NULL;
-            }
+            delete (*O);
+            (*O) = NULL;
 
             if (tmp)
             {
@@ -327,11 +321,8 @@ int sci_fft_gen(const char *fname, types::Double* A, types::Double** O, int isn,
             FREE(dims1);
             FREE(incr1);
 
-            if (*O)
-            {
-                delete (*O);
-                (*O) = NULL;
-            }
+            delete (*O);
+            (*O) = NULL;
 
             if (tmp)
             {
@@ -358,11 +349,8 @@ int sci_fft_gen(const char *fname, types::Double* A, types::Double** O, int isn,
             FREE(dims1);
             FREE(incr1);
 
-            if (*O)
-            {
-                delete (*O);
-                (*O) = NULL;
-            }
+            delete (*O);
+            (*O) = NULL;
 
             if (tmp)
             {
@@ -463,13 +451,9 @@ int sci_fft_gen(const char *fname, types::Double* A, types::Double** O, int isn,
 
     if (iErr == -1)
     {
-        if (*O)
-        {
-            delete (*O);
-            (*O) = NULL;
-        }
-
         Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+        delete (*O);
+        (*O) = NULL;
         return 0;
     }
 
index 6f05668..5a439c7 100644 (file)
@@ -311,7 +311,10 @@ int CheckKindArray(fftw_r2r_kind *kind1, fftw_r2r_kind *kind2, int rank)
     {
         return (1);
     }
-
+    if ((kind1 == NULL) || (kind2 == NULL))
+    {
+        return (0);
+    }
     for (i = 0; i < rank; i++)
     {
         if (kind1[i]  != kind2[i])
index f687547..2c6ef2b 100644 (file)
@@ -337,6 +337,7 @@ types::Function::ReturnValue common_3args(std::string& name, types::typed_list &
         Scierror(999, _("%s: Wrong type for input argument #%d.\n"), name.data(), 3);
         FREE(gdim.dims);
         FREE(gdim.howmany_dims);
+        return types::Function::Error;
     }
 
     getVarAsDims(in[2], rank, Sel);
@@ -573,6 +574,7 @@ types::Function::ReturnValue common_4args(std::string& name, types::typed_list &
         Scierror(999, _("%s: Wrong type for input argument #%d.\n"), name.data(), 3);
         FREE(gdim.dims);
         FREE(gdim.howmany_dims);
+        return types::Function::Error;
     }
 
     getVarAsDims(in[2], ndims, Dim1);
@@ -613,6 +615,7 @@ types::Function::ReturnValue common_4args(std::string& name, types::typed_list &
         FREE(Dim1);
         FREE(gdim.dims);
         FREE(gdim.howmany_dims);
+        return types::Function::Error;
     }
 
     getVarAsDims(in[3], nincr, Incr);