[io] memleak fixed 67/17167/5
Cedric Delamarre [Mon, 7 Sep 2015 08:09:21 +0000 (10:09 +0200)]
// bug_2389 fail, there is a memleak because
// we do not perform ludel
test_run("io", [], "mode_nwni_profiling")

Change-Id: I6aaf8c1cb1d38df8ac64596f35145c4950a747b9

scilab/modules/io/sci_gateway/c/sci_getenv.c
scilab/modules/io/sci_gateway/cpp/sci_read.cpp
scilab/modules/io/tests/nonreg_tests/bug_11997.dia.ref
scilab/modules/io/tests/nonreg_tests/bug_11997.tst
scilab/modules/io/tests/nonreg_tests/bug_2338.tst
scilab/modules/io/tests/nonreg_tests/bug_2389.tst
scilab/modules/io/tests/nonreg_tests/bug_5586.tst
scilab/modules/localization/src/c/charEncoding.c
scilab/modules/sparse/src/c/lu.c

index ef4f456..cf34dd5 100644 (file)
@@ -72,6 +72,10 @@ int sci_getenv(char *fname, void* pvApiCtx)
     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);
     if (sciErr.iErr)
     {
+        if (pStVarTwo)
+        {
+            freeAllocatedSingleString(pStVarTwo);
+        }
         printError(&sciErr, 0);
         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
         return 0;
@@ -79,6 +83,10 @@ int sci_getenv(char *fname, void* pvApiCtx)
 
     if (isStringType(pvApiCtx, piAddressVarOne) == 0 || isScalar(pvApiCtx, piAddressVarOne) == 0)
     {
+        if (pStVarTwo)
+        {
+            freeAllocatedSingleString(pStVarTwo);
+        }
         Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
         return 0;
     }
index 91a8b65..cdf3d51 100644 (file)
@@ -145,6 +145,7 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
         itTypeOfData = checkformat(pstFormat);
         if (itTypeOfData == InternalType::ScilabNull)
         {
+            FREE(pstFormat);
             closeFile(in[0], iID);
             Scierror(999, _("Incorrect file or format.\n"));
             return Function::Error;
@@ -155,6 +156,11 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
 
     if (in[1]->isDouble() == false)
     {
+        if (pstFormat)
+        {
+            FREE(pstFormat);
+        }
+
         closeFile(in[0], iID);
         Scierror(999, _("%s: Wrong type for input argument #%d: A scalar integer value expected.\n"), "read", 2);
         return Function::Error;
@@ -163,6 +169,10 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
     Double* pIn1 = in[1]->getAs<Double>();
     if (pIn1->isScalar() == false)
     {
+        if (pstFormat)
+        {
+            FREE(pstFormat);
+        }
         closeFile(in[0], iID);
         Scierror(999, _("%s: Wrong size for input argument #%d: A scalar integer value expected.\n"), "read", 2);
         return Function::Error;
@@ -170,6 +180,10 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
 
     if (in[2]->isDouble() == false)
     {
+        if (pstFormat)
+        {
+            FREE(pstFormat);
+        }
         closeFile(in[0], iID);
         Scierror(999, _("%s: Wrong type for input argument #%d: A scalar integer value expected.\n"), "read", 3);
         return Function::Error;
@@ -178,6 +192,10 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
     Double* pIn2 = in[2]->getAs<Double>();
     if (pIn2->isScalar() == false)
     {
+        if (pstFormat)
+        {
+            FREE(pstFormat);
+        }
         closeFile(in[0], iID);
         Scierror(999, _("%s: Wrong size for input argument #%d: A scalar integer value expected.\n"), "read", 3);
         return Function::Error;
@@ -189,7 +207,7 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
     //test dims
     if ( (iCols <= 0) || (iRows == 0))
     {
-        if (pstFormat != NULL)
+        if (pstFormat)
         {
             FREE(pstFormat);
         }
@@ -291,6 +309,10 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
                 {
                     if (iCols != 1)
                     {
+                        if (pstFormat)
+                        {
+                            FREE(pstFormat);
+                        }
                         closeFile(in[0], iID);
                         Scierror(999, _("%s: Wrong input argument %d.\n"), "read", 3);
                         return Function::Error;
@@ -328,6 +350,10 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
                 break;
                 default:
                 {
+                    if (pstFormat)
+                    {
+                        FREE(pstFormat);
+                    }
                     closeFile(in[0], iID);
                     Scierror(999, _("%s: Wrong type for input argument #%d : A string expected.\n"), "read", 2);
                     return Function::Error;
@@ -386,7 +412,10 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
                         {
                             delete[] pdData;
                             delete pD;
-
+                            if (pstFormat)
+                            {
+                                FREE(pstFormat);
+                            }
                             Scierror(999, _("End of file at line %d.\n"));
                             return Function::Error;
                         }
@@ -410,12 +439,24 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
                 }
                 break;
                 case InternalType::ScilabInt32:
+                {
+                    if (pstFormat)
+                    {
+                        FREE(pstFormat);
+                    }
+
                     Scierror(999, _("Incorrect file or format.\n"));
                     return Function::Error;
+                }
                 case InternalType::ScilabString:
                 {
                     if (iCols != 1)
                     {
+                        if (pstFormat)
+                        {
+                            FREE(pstFormat);
+                        }
+
                         Scierror(999, _("%s: Wrong input argument %d.\n"), "read", 3);
                         return Function::Error;
                     }
@@ -530,6 +571,11 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
                 break;
                 default:
                 {
+                    if (pstFormat)
+                    {
+                        FREE(pstFormat);
+                    }
+
                     Scierror(999, _("%s: Wrong type for input argument #%d : A string expected.\n"), "read", 2);
                     closeFile(in[0], iID);
                     return Function::Error;
@@ -541,6 +587,11 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
 
             if (error == 2)
             {
+                if (pstFormat)
+                {
+                    FREE(pstFormat);
+                }
+
                 Scierror(999, _("Incorrect file or format.\n"));
                 return Function::Error;
             }
@@ -589,8 +640,6 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
                         }
                     }
 
-                    FREE(pstFormat);
-
                     if (error == 0)
                     {
                         out.push_back(pD);
@@ -602,12 +651,24 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
                 }
                 break;
                 case InternalType::ScilabInt32:
+                {
+                    if (pstFormat)
+                    {
+                        FREE(pstFormat);
+                    }
+
                     Scierror(999, _("Incorrect file or format.\n"));
                     return Function::Error;
+                }
                 case InternalType::ScilabString:
                 {
                     if (iCols != 1)
                     {
+                        if (pstFormat)
+                        {
+                            FREE(pstFormat);
+                        }
+
                         Scierror(999, _("%s: Wrong input argument %d.\n"), "read", 3);
                         return Function::Error;
                     }
@@ -642,11 +703,20 @@ Function::ReturnValue sci_read(typed_list &in, int _iRetCount, typed_list &out)
 
         if (error != 0)
         {
+            if (pstFormat)
+            {
+                FREE(pstFormat);
+            }
             closeFile(in[0], iID);
             Scierror(999, _("Incorrect file or format.\n"));
             return Function::Error;
         }
     }
 
+    if (pstFormat)
+    {
+        FREE(pstFormat);
+    }
+
     return Function::OK;
 }
index 85e069c..c1419f8 100644 (file)
@@ -6,7 +6,7 @@
 // =============================================================================
 //
 // <-- Non-regression test for bug 11997 -->
-//
+// <-- CLI SHELL MODE -->
 // <-- Bugzilla URL -->
 // http://bugzilla.scilab.org/show_bug.cgi?id=11997
 //
@@ -14,5 +14,5 @@
 // save function show compatibility warning for non existing variable instead of error
 clear a;
 //3 instead of 2 because of call through execstr
-errmsg = msprintf(_("Wrong value for argument #%d: Valid variable name expected.\n"), 3);
+errmsg = msprintf(_("%s: Wrong value for input argument #%d: Defined variable expected.\n"), "save", 2);
 assert_checkerror("save(TMPDIR + ""/myData.sod"", ""a"")", errmsg);
index 9a5d262..b18358b 100644 (file)
@@ -6,7 +6,7 @@
 // =============================================================================
 //
 // <-- Non-regression test for bug 11997 -->
-//
+// <-- CLI SHELL MODE -->
 // <-- Bugzilla URL -->
 // http://bugzilla.scilab.org/show_bug.cgi?id=11997
 //
@@ -15,6 +15,6 @@
 
 clear a;
 //3 instead of 2 because of call through execstr
-errmsg = msprintf(_("Wrong value for argument #%d: Valid variable name expected.\n"), 3);
+errmsg = msprintf(_("%s: Wrong value for input argument #%d: Defined variable expected.\n"), "save", 2);
 assert_checkerror("save(TMPDIR + ""/myData.sod"", ""a"")", errmsg);
 
index e81f91e..faa631a 100644 (file)
@@ -7,7 +7,7 @@
 // =============================================================================
 
 // <-- Non-regression test for bug 2338 -->
-//
+// <-- CLI SHELL MODE -->
 // <-- Bugzilla URL -->
 // http://bugzilla.scilab.org/show_bug.cgi?id=2338
 //
index 605875d..26422ee 100644 (file)
@@ -6,7 +6,7 @@
 // =============================================================================
 
 // <-- Non-regression test for bug 2389 -->
-//
+// <-- CLI SHELL MODE -->
 // <-- Bugzilla URL -->
 // http://bugzilla.scilab.org/show_bug.cgi?id=2389
 //
@@ -17,3 +17,5 @@ A       = sparse(rand(5,5));
 [h,rk]  = lufact(A);
 
 if execstr("save(TMPDIR+""/pointer.bin"",""h"")", "errcatch")<>0 then pause,end
+
+ludel(h);
index 51b609b..e1800af 100644 (file)
@@ -6,16 +6,16 @@
 // =============================================================================
 
 // <-- Non-regression test for bug 5586 -->
-
+// <-- CLI SHELL MODE -->
 // <-- Short Description -->
 // getscilabkeywords() was broken
 
 //
 // <-- Bugzilla URL -->
 // http://bugzilla.scilab.org/show_bug.cgi?id=5586
-// 
+//
 
-ierr = execstr('getscilabkeywords()','errcatch')
+ierr = execstr("getscilabkeywords()","errcatch");
 if ierr <> 0 then pause,end;
 
 r = getscilabkeywords();
index 34d915e..cb98a3b 100644 (file)
@@ -228,16 +228,16 @@ wchar_t *to_wide_string(const char *_UTFStr)
     size_t iSize = 0;
     size_t iLeftIn = 0;
     size_t iLeftOut = 0;
-
+    iconv_t cd_UTF8_to_UTF16 = NULL;
     wchar_t* pOut = NULL;
 
-    iconv_t cd_UTF8_to_UTF16 = iconv_open("WCHAR_T", "UTF-8");
-
     if (_UTFStr == NULL)
     {
         return NULL;
     }
 
+    cd_UTF8_to_UTF16 = iconv_open("WCHAR_T", "UTF-8");
+
     iLeftIn = strlen(_UTFStr);
     pInSave = (char*)_UTFStr;
 
index fe1ccc6..774079f 100644 (file)
@@ -85,6 +85,7 @@ void C2F(lufact1)(double *val, int *lln, int *col, int *n, int *nel,
     *fmatindex = addluptr (fmat);
     if ( *fmatindex == -1)
     {
+        spDestroy(fmat);
         *ierr = 1;
         return;
     }
@@ -107,6 +108,8 @@ void C2F(lufact1)(double *val, int *lln, int *col, int *n, int *nel,
 
         if (pelement == 0)
         {
+            removeluptr(fmat);
+            spDestroy(fmat);
             *ierr = 2;
             return;
         }
@@ -125,18 +128,21 @@ void C2F(lufact1)(double *val, int *lln, int *col, int *n, int *nel,
     {
         case spZERO_DIAG:
             Scierror(999, _("%s: A zero was encountered on the diagonal the matrix.\n"), "zero_diag");
-            break;
+            removeluptr(fmat);
+            spDestroy(fmat);
+            return;
         case spNO_MEMORY:
             *ierr = 3;
-            break;
+            removeluptr(fmat);
+            spDestroy(fmat);
+            return;
         case spSINGULAR:
             *ierr = -1; /*Singular matrix" */
-            break;
+            return;
         case spSMALL_PIVOT:
             *ierr = -2; /* matrix is singular at precision level */
-            break;
+            return;
     }
-
 }
 
 /*