Coverity: elementary_functions module memory errors fixed 12/18312/7
Dhruv Khattar [Mon, 27 Jun 2016 21:02:49 +0000 (02:02 +0530)]
Change-Id: Ic7e359d3f41ab5e2db77a8ee06d1733d45e3631d

scilab/modules/elementary_functions/sci_gateway/c/sci_nearfloat.c
scilab/modules/elementary_functions/sci_gateway/c/sci_testmatrix.c
scilab/modules/elementary_functions/sci_gateway/cpp/elem_func_gw.cpp
scilab/modules/elementary_functions/sci_gateway/cpp/sci_clean.cpp
scilab/modules/elementary_functions/sci_gateway/cpp/sci_matrix.cpp
scilab/modules/elementary_functions/src/c/expm.c
scilab/modules/elementary_functions/src/cpp/getmode.cpp

index e3af9f4..8745051 100644 (file)
@@ -105,6 +105,7 @@ int sci_nearfloat(char *fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        free(piLen);
         return 0;
     }
 
@@ -118,6 +119,12 @@ int sci_nearfloat(char *fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        free(piLen);
+        for (i = 0 ; i < iRows1 * iCols1 ; i++)
+        {
+            free(pstData[i]);
+        }
+        free(pstData);
         return 0;
     }
 
@@ -125,6 +132,12 @@ int sci_nearfloat(char *fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        free(piLen);
+        for (i = 0 ; i < iRows1 * iCols1 ; i++)
+        {
+            free(pstData[i]);
+        }
+        free(pstData);
         return 0;
     }
 
@@ -139,6 +152,12 @@ int sci_nearfloat(char *fname, void* pvApiCtx)
     else
     {
         SciError(999);
+        free(piLen);
+        for (i = 0 ; i < iRows1 * iCols1 ; i++)
+        {
+            free(pstData[i]);
+        }
+        free(pstData);
         return 0;
     }
 
@@ -146,6 +165,12 @@ int sci_nearfloat(char *fname, void* pvApiCtx)
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        free(piLen);
+        for (i = 0 ; i < iRows1 * iCols1 ; i++)
+        {
+            free(pstData[i]);
+        }
+        free(pstData);
         return 0;
     }
 
index 120aa9d..a2f18f4 100644 (file)
@@ -118,14 +118,15 @@ char getGenerateMode(void* pvApiCtx, int* _piAddress)
     int iRet = 0;
 
     char* pstData;
-
+    char ret;
     iRet = getAllocatedSingleString(pvApiCtx, _piAddress, &pstData);
     if (iRet)
     {
         return -1;
     }
-
-    return pstData[0];
+    ret = pstData[0];
+    freeAllocatedSingleString(pstData);
+    return ret;
 }
 
 int getGenerateSize(void* pvApiCtx, int* _piAddress)
index 74b6c4b..0af7095 100644 (file)
@@ -159,16 +159,16 @@ bool getDimsFromArguments(types::typed_list& in, const std::string& _pstName, in
         {
             if (in[i]->isArrayOf() == false)
             {
-                delete[] * _piDims;
                 Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), _pstName.c_str(), i + 1);
+                delete[] * _piDims;
                 return false;
             }
 
             types::GenericType* pGTIn = in[i]->getAs<types::GenericType>();
             if (pGTIn->isScalar() == false || pGTIn->isComplex())
             {
-                delete[] * _piDims;
                 Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), _pstName.c_str(), i + 1);
+                delete[] * _piDims;
                 return false;
             }
 
@@ -179,8 +179,8 @@ bool getDimsFromArguments(types::typed_list& in, const std::string& _pstName, in
                     double dValue = in[i]->getAs<types::Double>()->get(0);
                     if (dValue >= INT_MAX)
                     {
-                        delete[] * _piDims;
                         Scierror(999, _("%s: variable size exceeded : less than %d expected.\n"), _pstName.c_str(), INT_MAX);
+                        delete[] * _piDims;
                         return false;
                     }
                     (*_piDims)[i] = static_cast<int>(dValue);
@@ -209,8 +209,8 @@ bool getDimsFromArguments(types::typed_list& in, const std::string& _pstName, in
                     long long llValue = in[i]->getAs<types::Int64>()->get(0);
                     if (llValue >= INT_MAX)
                     {
-                        delete[] * _piDims;
                         Scierror(999, _("%s: variable size exceeded : less than %d expected.\n"), _pstName.c_str(), INT_MAX);
+                        delete[] * _piDims;
                         return false;
                     }
                     (*_piDims)[i] = static_cast<int>(llValue);
@@ -221,8 +221,8 @@ bool getDimsFromArguments(types::typed_list& in, const std::string& _pstName, in
                     unsigned long long ullValue = in[i]->getAs<types::UInt64>()->get(0);
                     if (ullValue >= INT_MAX)
                     {
-                        delete[] * _piDims;
                         Scierror(999, _("%s: variable size exceeded : less than %d expected.\n"), _pstName.c_str(), INT_MAX);
+                        delete[] * _piDims;
                         return false;
                     }
                     (*_piDims)[i] = static_cast<int>(ullValue);
@@ -230,6 +230,7 @@ bool getDimsFromArguments(types::typed_list& in, const std::string& _pstName, in
                 }
                 default:
                     Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), _pstName.c_str(), i + 1);
+                    delete[] * _piDims;
                     return false;
             }
         }
index c1bdfdb..141b7d5 100644 (file)
@@ -109,6 +109,16 @@ types::Function::ReturnValue sci_clean(types::typed_list &in, int _iRetCount, ty
         if (in[2]->isDouble() == false)
         {
             Scierror(999, _("%s: Wrong type for input argument #%d : A real scalar expected.\n"), "clean", 3);
+            if (in[0]->isSparse())
+            {
+                delete pSparseOut;
+                delete[] pdReal;
+                delete[] pRows;
+                if (pdImg)
+                {
+                    delete[] pdImg;
+                }
+            }
             return types::Function::Error;
         }
 
@@ -117,6 +127,16 @@ types::Function::ReturnValue sci_clean(types::typed_list &in, int _iRetCount, ty
         if (pDbl->isScalar() == false || pDbl->isComplex())
         {
             Scierror(999, _("%s: Wrong type for input argument #%d : A real scalar expected.\n"), "clean", 3);
+            if (in[0]->isSparse())
+            {
+                delete pSparseOut;
+                delete[] pdReal;
+                delete[] pRows;
+                if (pdImg)
+                {
+                    delete[] pdImg;
+                }
+            }
             return types::Function::Error;
         }
 
@@ -128,6 +148,16 @@ types::Function::ReturnValue sci_clean(types::typed_list &in, int _iRetCount, ty
         if (in[1]->isDouble() == false)
         {
             Scierror(999, _("%s: Wrong type for input argument #%d : A real scalar expected.\n"), "clean", 2);
+            if (in[0]->isSparse())
+            {
+                delete pSparseOut;
+                delete[] pdReal;
+                delete[] pRows;
+                if (pdImg)
+                {
+                    delete[] pdImg;
+                }
+            }
             return types::Function::Error;
         }
 
@@ -136,6 +166,16 @@ types::Function::ReturnValue sci_clean(types::typed_list &in, int _iRetCount, ty
         if (pDbl->isScalar() == false || pDbl->isComplex())
         {
             Scierror(999, _("%s: Wrong type for input argument #%d : A real scalar expected.\n"), "clean", 2);
+            if (in[0]->isSparse())
+            {
+                delete pSparseOut;
+                delete[] pdReal;
+                delete[] pRows;
+                if (pdImg)
+                {
+                    delete[] pdImg;
+                }
+            }
             return types::Function::Error;
         }
 
index c258913..b69543c 100644 (file)
@@ -70,8 +70,8 @@ types::Function::ReturnValue sci_matrix(types::typed_list &in, int _iRetCount, t
     {
         if (in[1]->isDouble() == false)
         {
-            pGTOut->killMe();
             Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "matrix", 2);
+            pGTOut->killMe();
             return types::Function::Error;
         }
 
@@ -79,8 +79,8 @@ types::Function::ReturnValue sci_matrix(types::typed_list &in, int _iRetCount, t
 
         if (pDblNewSize->isComplex())
         {
-            pGTOut->killMe();
             Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "matrix", 2);
+            pGTOut->killMe();
             return types::Function::Error;
         }
 
@@ -98,15 +98,17 @@ types::Function::ReturnValue sci_matrix(types::typed_list &in, int _iRetCount, t
                 }
                 else
                 {
-                    pGTOut->killMe();
                     Scierror(999, _("%s: Wrong value for input argument #%d : Only one value can be equal to %d.\n"), "matrix", 2, -1);
+                    pGTOut->killMe();
+                    delete[] piSizes;
                     return types::Function::Error;
                 }
             }
             else if (piSizes[i] < -1)
             {
-                pGTOut->killMe();
                 Scierror(999, _("%s: Wrong value for input argument #%d : At most %d expected.\n"), "matrix", 2, -1);
+                pGTOut->killMe();
+                delete[] piSizes;
                 return types::Function::Error;
             }
             else
@@ -123,8 +125,9 @@ types::Function::ReturnValue sci_matrix(types::typed_list &in, int _iRetCount, t
         {
             if (in[i]->isDouble() == false)
             {
-                pGTOut->killMe();
                 Scierror(999, _("%s: Wrong type for input argument #%d : A real scalar expected.\n"), "matrix", i + 1);
+                pGTOut->killMe();
+                delete[] piSizes;
                 return types::Function::Error;
             }
 
@@ -132,8 +135,9 @@ types::Function::ReturnValue sci_matrix(types::typed_list &in, int _iRetCount, t
 
             if (pDblNewSize->isComplex() || pDblNewSize->isScalar() == false)
             {
-                pGTOut->killMe();
                 Scierror(999, _("%s: Wrong type for input argument #%d : A real scalar expected.\n"), "matrix", i + 1);
+                pGTOut->killMe();
+                delete[] piSizes;
                 return types::Function::Error;
             }
 
@@ -146,15 +150,17 @@ types::Function::ReturnValue sci_matrix(types::typed_list &in, int _iRetCount, t
                 }
                 else
                 {
-                    pGTOut->killMe();
                     Scierror(999, _("%s: Wrong value for input argument #%d : Only one value can be equal to %d.\n"), "matrix", i + 1, -1);
+                    pGTOut->killMe();
+                    delete[] piSizes;
                     return types::Function::Error;
                 }
             }
             else if (piSizes[i - 1] < -1)
             {
-                pGTOut->killMe();
                 Scierror(999, _("%s: Wrong value for input argument #%d : At most %d expected.\n"), "matrix", i + 1, -1);
+                pGTOut->killMe();
+                delete[] piSizes;
                 return types::Function::Error;
             }
             else
@@ -171,22 +177,22 @@ types::Function::ReturnValue sci_matrix(types::typed_list &in, int _iRetCount, t
 
     if (pGTOut->isSparse() && iDims > 2)
     {
-        pGTOut->killMe();
         Scierror(999, _("%s: Wrong value for input argument(s) : Sparse matrix cannot be reshaped beyond %d dimensions.\n"), "matrix", 2);
+        pGTOut->killMe();
+        delete[] piSizes;
         return types::Function::Error;
     }
 
     bOk = pGTOut->reshape(piSizes, iDims);
+    delete[] piSizes;
 
     if (bOk == false)
     {
-        pGTOut->killMe();
         Scierror(999, _("%s: Input and output matrices must have the same number of elements.\n"), "matrix");
+        pGTOut->killMe();
         return types::Function::Error;
     }
 
-    delete[] piSizes;
-
     out.push_back(pGTOut);
     return types::Function::OK;
 }
index fd456fe..1cb3fc0 100644 (file)
@@ -114,6 +114,8 @@ int dexpms(int _iLeadDim, int _iSize, double *_pdblVal, double *_pdblReturn)
 
     if (iErr)
     {
+        free(piWS);
+        free(pdblWS);
         return -2;
     }
 
@@ -172,6 +174,8 @@ int dexpms(int _iLeadDim, int _iSize, double *_pdblVal, double *_pdblReturn)
                 */
                 if (iErr < 0)
                 {
+                    free(piWS);
+                    free(pdblWS);
                     return 0;
                 }
 
@@ -435,6 +439,7 @@ int dbdiaga(int _iLeadDim, int _iSize, double *_pdblVal, double _dblEps,
                             //C2F(split)(_pdblVal, _pdblRightReduce, &_iSize, &iKm1, &dblE1, &dblE2, &_iLeadDim, &_iLeadDim);
                             dsplits(_pdblVal, _pdblRightReduce, _iSize, iKm1, &dblE1, &dblE2, _iLeadDim, _iLeadDim);
                         }
+                        iK--;
                     }
                 }
 
index 1fef366..0697ce6 100644 (file)
@@ -64,18 +64,20 @@ int getMode(types::typed_list &in, int _iProcess, int _iRef)
             Scierror(999, _("%s: Wrong size for argument %d: (%d,%d) expected.\n"), "size", _iProcess + 1, 1, 1);
             iMode = -2;
         }
-
-        iMode = static_cast<int>(pD->getReal()[0]);
-        if (pD->getReal()[0] != static_cast<double>(iMode))
+        else
         {
-            Scierror(999, _("%s: Wrong value for input argument #%d: An integer value expected.\n"), "size", 2);
-            iMode = -2;
-        }
+            iMode = static_cast<int>(pD->getReal()[0]);
+            if (pD->getReal()[0] != static_cast<double>(iMode))
+            {
+                Scierror(999, _("%s: Wrong value for input argument #%d: An integer value expected.\n"), "size", 2);
+                iMode = -2;
+            }
 
-        if (iMode <= 0)
-        {
-            Scierror(999, _("%s: Wrong value for input argument #%d: Scalar positive integer expected.\n"), "size", 2);
-            iMode = -2;
+            if (iMode <= 0)
+            {
+                Scierror(999, _("%s: Wrong value for input argument #%d: Scalar positive integer expected.\n"), "size", 2);
+                iMode = -2;
+            }
         }
     }
     else