* Bug #13620 fixed - dos function called with a vector as input crashed. 56/18556/3
Adeline CARNIS [Fri, 23 Sep 2016 13:44:09 +0000 (15:44 +0200)]
Change-Id: If16cc437e94ac32a831ec436cc1d1578c6f0f7a1

scilab/CHANGES.md
scilab/modules/windows_tools/sci_gateway/cpp/sci_dos.cpp
scilab/modules/windows_tools/tests/nonreg_tests/bug_13620.dia.ref [new file with mode: 0644]
scilab/modules/windows_tools/tests/nonreg_tests/bug_13620.tst [new file with mode: 0644]

index 250a6f7..57827bc 100644 (file)
@@ -340,6 +340,7 @@ Bug Fixes
 * [#13583](http://bugzilla.scilab.org/show_bug.cgi?id=13583): `getd` loading a script including a `clear` instruction yielded an error
 * [#13597](http://bugzilla.scilab.org/show_bug.cgi?id=13597): `help format` claimed setting a number of digits instead of characters
 * [#13613](http://bugzilla.scilab.org/show_bug.cgi?id=13613): `isdef(name, 'l')` produced wrong output.
+* [#13620](http://bugzilla.scilab.org/show_bug.cgi?id=13620): `dos` called with a vector as input crashed.
 * [#13757](http://bugzilla.scilab.org/show_bug.cgi?id=13757): The toolbox menu dit not load properly ATOMS modules not autoloaded.
 * [#13878](http://bugzilla.scilab.org/show_bug.cgi?id=13878): tokens([]) returns [].
 * [#13895](http://bugzilla.scilab.org/show_bug.cgi?id=13895): p.a.h = 1; p.b.h = 3; p(:).h  CRASH
index 7fc0d75..b5497c1 100644 (file)
@@ -42,9 +42,7 @@ int sci_dos(char *fname, void* pvApiCtx)
     SciErr sciErr;
     int *piAddressVarOne = NULL;
     int iType1 = 0;
-    int m1 = 0, n1 = 0;
     wchar_t *pStVarOne = NULL;
-    int lenStVarOne = 0;
 
     char **Output = NULL;
     int numberoflines = 0;
@@ -149,176 +147,160 @@ int sci_dos(char *fname, void* pvApiCtx)
         return 0;
     }
 
-    sciErr = getMatrixOfString(pvApiCtx, piAddressVarOne, &m1, &n1, &lenStVarOne, NULL);
-    if (sciErr.iErr)
+    if (isScalar(pvApiCtx, piAddressVarOne) == FALSE)
     {
-        printError(&sciErr, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+        Scierror(999, _("%s: Wrong size for input argument #%d: string expected.\n"), fname, 1);
         return 0;
     }
 
-    if ( (m1 != n1) && (n1 != 1) )
+    if (getAllocatedSingleWideString(pvApiCtx, piAddressVarOne, &pStVarOne))
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d: string expected.\n"), fname, 1);
+        printError(&sciErr, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
         return 0;
     }
 
-    pStVarOne = (wchar_t*)MALLOC(sizeof(wchar_t) * (lenStVarOne + 1));
-    if (pStVarOne)
-    {
-        double exitCode = 0.;
-        BOOL DetachProcessOption = FALSE;
-        BOOL *StatusExit = NULL;
-
-        sciErr = getMatrixOfWideString(pvApiCtx, piAddressVarOne, &m1, &n1, &lenStVarOne, &pStVarOne);
-        if (sciErr.iErr)
-        {
-            printError(&sciErr, 0);
-            Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
-            return 0;
-        }
+    double exitCode = 0.;
+    BOOL DetachProcessOption = FALSE;
+    BOOL *StatusExit = NULL;
 
-        DetachProcessOption = DetectDetachProcessInCommandLine(pStVarOne);
-        exitCode = (double)spawncommand(pStVarOne, DetachProcessOption);
-        FREE(pStVarOne);
+    DetachProcessOption = DetectDetachProcessInCommandLine(pStVarOne);
+    exitCode = (double)spawncommand(pStVarOne, DetachProcessOption);
+    freeAllocatedSingleWideString(pStVarOne);
 
-        StatusExit = (BOOL*)MALLOC(sizeof(BOOL));
+    StatusExit = (BOOL*)MALLOC(sizeof(BOOL));
 
-        if (DetachProcessOption)
+    if (DetachProcessOption)
+    {
+        if (strlen((const char *)(pipeSpawnErr.OutputBuffer)))
         {
-            if ( strlen((const char *)(pipeSpawnErr.OutputBuffer)) )
-            {
-                /* StdErr will be "Output" */
-                *StatusExit = FALSE;
-                Output = CreateOuput(&pipeSpawnErr, DetachProcessOption);
-                numberoflines = pipeSpawnErr.NumberOfLines;
-            }
-            else
-            {
-                /* StdOut will be "Output" */
-                *StatusExit = TRUE;
-                Output = CreateOuput(&pipeSpawnOut, DetachProcessOption);
-                numberoflines = pipeSpawnOut.NumberOfLines;
-            }
+            /* StdErr will be "Output" */
+            *StatusExit = FALSE;
+            Output = CreateOuput(&pipeSpawnErr, DetachProcessOption);
+            numberoflines = pipeSpawnErr.NumberOfLines;
         }
         else
         {
-            char FileTMPDir[PATH_MAX + 16];
-            BOOL bConvert = FALSE;
+            /* StdOut will be "Output" */
+            *StatusExit = TRUE;
+            Output = CreateOuput(&pipeSpawnOut, DetachProcessOption);
+            numberoflines = pipeSpawnOut.NumberOfLines;
+        }
+    }
+    else
+    {
+        char FileTMPDir[PATH_MAX + 16];
+        BOOL bConvert = FALSE;
 
-            char *TMPDirLong = getTMPDIR();
-            char *TMPDirShort = getshortpathname(TMPDirLong, &bConvert);
+        char *TMPDirLong = getTMPDIR();
+        char *TMPDirShort = getshortpathname(TMPDirLong, &bConvert);
 
-            sprintf(FileTMPDir, "%s\\DOS.OK", TMPDirLong);
-            FREE(TMPDirLong);
-            TMPDirLong = NULL;
-            FREE(TMPDirShort);
-            TMPDirShort = NULL;
+        sprintf(FileTMPDir, "%s\\DOS.OK", TMPDirLong);
+        FREE(TMPDirLong);
+        TMPDirLong = NULL;
+        FREE(TMPDirShort);
+        TMPDirShort = NULL;
 
-            if (FileExist(FileTMPDir))
-            {
-                DeleteFile(FileTMPDir);
-                /* StdOut will be "Output" */
-                *StatusExit = TRUE;
-                Output = CreateOuput(&pipeSpawnOut, DetachProcessOption);
-                numberoflines = pipeSpawnOut.NumberOfLines;
-            }
-            else
-            {
-                /* StdErr will be "Output" */
-                *StatusExit = FALSE;
-                Output = CreateOuput(&pipeSpawnErr, DetachProcessOption);
-                numberoflines = pipeSpawnErr.NumberOfLines;
-            }
+        if (FileExist(FileTMPDir))
+        {
+            DeleteFile(FileTMPDir);
+            /* StdOut will be "Output" */
+            *StatusExit = TRUE;
+            Output = CreateOuput(&pipeSpawnOut, DetachProcessOption);
+            numberoflines = pipeSpawnOut.NumberOfLines;
         }
-
-        if (ECHOMODE)
+        else
         {
-            PrintOuput(Output, numberoflines);
+            /* StdErr will be "Output" */
+            *StatusExit = FALSE;
+            Output = CreateOuput(&pipeSpawnErr, DetachProcessOption);
+            numberoflines = pipeSpawnErr.NumberOfLines;
         }
+    }
+
+    if (ECHOMODE)
+    {
+        PrintOuput(Output, numberoflines);
+    }
 
-        if (Lhs == 1)
+    if (Lhs == 1)
+    {
+        int m_out = 1, n_out = 1;
+        sciErr = createMatrixOfBoolean(pvApiCtx, Rhs + 1, m_out, n_out, StatusExit);
+        if (sciErr.iErr)
         {
-            int m_out = 1, n_out = 1;
-            sciErr = createMatrixOfBoolean(pvApiCtx, Rhs + 1, m_out, n_out, StatusExit);
-            if (sciErr.iErr)
-            {
-                printError(&sciErr, 0);
-                Scierror(999, _("%s: Memory allocation error.\n"), fname);
-                return 0;
-            }
+            printError(&sciErr, 0);
+            Scierror(999, _("%s: Memory allocation error.\n"), fname);
+            return 0;
+        }
 
-            LhsVar(1) = Rhs + 1;
+        LhsVar(1) = Rhs + 1;
+    }
+    else
+    {
+        int m_out2 = 1;
+        int n_out2 = 1;
+
+        if (Output && Output[0])
+        {
+            int m_out1 = numberoflines;
+            int n_out1 = 1;
+            sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, m_out1, n_out1, Output);
         }
         else
         {
-            int m_out2 = 1;
-            int n_out2 = 1;
-
-            if (Output && Output[0])
-            {
-                int m_out1 = numberoflines;
-                int n_out1 = 1;
-                sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, m_out1, n_out1, Output);
-            }
-            else
-            {
-                /* returns [] */
-                int m_out1 = 0;
-                int n_out1 = 0;
-                sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 1, m_out1, n_out1, NULL);
-            }
+            /* returns [] */
+            int m_out1 = 0;
+            int n_out1 = 0;
+            sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 1, m_out1, n_out1, NULL);
+        }
 
-            if (sciErr.iErr)
-            {
-                printError(&sciErr, 0);
-                Scierror(999, _("%s: Memory allocation error.\n"), fname);
-                return 0;
-            }
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            Scierror(999, _("%s: Memory allocation error.\n"), fname);
+            return 0;
+        }
 
-            LhsVar(1) = Rhs + 1;
+        LhsVar(1) = Rhs + 1;
 
-            sciErr = createMatrixOfBoolean(pvApiCtx, Rhs + 2, m_out2, n_out2, StatusExit);
-            if (sciErr.iErr)
-            {
-                printError(&sciErr, 0);
-                Scierror(999, _("%s: Memory allocation error.\n"), fname);
-                return 0;
-            }
-
-            LhsVar(2) = Rhs + 2;
+        sciErr = createMatrixOfBoolean(pvApiCtx, Rhs + 2, m_out2, n_out2, StatusExit);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            Scierror(999, _("%s: Memory allocation error.\n"), fname);
+            return 0;
         }
 
-        if (Lhs > 2)
-        {
-            int m_out3 = 1, n_out3 = 1;
-            sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 3, m_out3, n_out3, &exitCode);
-            if (sciErr.iErr)
-            {
-                printError(&sciErr, 0);
-                Scierror(999, _("%s: Memory allocation error.\n"), fname);
-                return 0;
-            }
+        LhsVar(2) = Rhs + 2;
+    }
 
-            LhsVar(3) = Rhs + 3;
-        }
-        if (StatusExit)
+    if (Lhs > 2)
+    {
+        int m_out3 = 1, n_out3 = 1;
+        sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 3, m_out3, n_out3, &exitCode);
+        if (sciErr.iErr)
         {
-            FREE(StatusExit);
-            StatusExit = NULL;
+            printError(&sciErr, 0);
+            Scierror(999, _("%s: Memory allocation error.\n"), fname);
+            return 0;
         }
-        freeArrayOfString(Output, numberoflines);
 
-        ClosePipeInfo (pipeSpawnOut);
-        ClosePipeInfo (pipeSpawnErr);
-
-        PutLhsVar();
+        LhsVar(3) = Rhs + 3;
     }
-    else
+    if (StatusExit)
     {
-        Scierror(999, _("%s: No more memory.\n"), fname);
+        FREE(StatusExit);
+        StatusExit = NULL;
     }
 
+    freeArrayOfString(Output, numberoflines);
+
+    ClosePipeInfo(pipeSpawnOut);
+    ClosePipeInfo(pipeSpawnErr);
+
+    PutLhsVar();
+
     return 0;
 }
 /*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/windows_tools/tests/nonreg_tests/bug_13620.dia.ref b/scilab/modules/windows_tools/tests/nonreg_tests/bug_13620.dia.ref
new file mode 100644 (file)
index 0000000..2934fee
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 13620 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13620
+//
+// <-- Short Description -->
+//    dos function called with a vector as input crashed.
+// =============================================================================
+assert_checkfalse(execstr("dos([""dir"", ""dir""])"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong size for input argument #%d: string expected.\n"), "dos", 1);
+assert_checkerror("dos([""dir"", ""dir""])", refMsg);
+assert_checkfalse(execstr("dos([""dir""; ""dir""])"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong size for input argument #%d: string expected.\n"), "dos", 1);
+assert_checkerror("dos([""dir"", ""dir""])", refMsg);
diff --git a/scilab/modules/windows_tools/tests/nonreg_tests/bug_13620.tst b/scilab/modules/windows_tools/tests/nonreg_tests/bug_13620.tst
new file mode 100644 (file)
index 0000000..d5b409c
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 13620 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13620
+//
+// <-- Short Description -->
+//    dos function called with a vector as input crashed.
+// =============================================================================
+
+assert_checkfalse(execstr("dos([""dir"", ""dir""])"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong size for input argument #%d: string expected.\n"), "dos", 1);
+assert_checkerror("dos([""dir"", ""dir""])", refMsg);
+
+assert_checkfalse(execstr("dos([""dir""; ""dir""])"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong size for input argument #%d: string expected.\n"), "dos", 1);
+assert_checkerror("dos([""dir"", ""dir""])", refMsg);