* Bug #14375 fixed - Calling input function with a argument of 64 characters or more... 13/17813/5
Adeline CARNIS [Tue, 23 Feb 2016 13:42:26 +0000 (14:42 +0100)]
Change-Id: I4a5be5855dcdb6c49a6efdc621833abf1c4cdb87

scilab/CHANGES
scilab/modules/console/sci_gateway/cpp/sci_prompt.cpp
scilab/modules/console/tests/unit_tests/prompt.dia.ref
scilab/modules/console/tests/unit_tests/prompt.tst
scilab/modules/io/macros/input.sci
scilab/modules/io/tests/nonreg_tests/bug_14375.tst [new file with mode: 0644]

index 159df9f..bdbb948 100644 (file)
@@ -397,6 +397,8 @@ In 6.0.0:
 
 * Bug #14374 fixed - Parser did not manage comments properly in shellmode
 
+* Bug #14375 fixed - Calling input function with a argument of 64 characters or more crashed Scilab.
+
 * Bug #14389 fixed - Updated int8(), type(), typeof(), overloading(), iconvert() and inttype() help pages. Added int64() and uint64() descriptions.
 
 * Bug #14390 fixed - double() help page had irrelevant syntaxes and was poor
index ce46a1f..a4fef72 100644 (file)
@@ -68,7 +68,17 @@ types::Function::ReturnValue sci_prompt(types::typed_list &in, int _iRetCount, t
             Scierror(999, _("%s: Wrong type for input argument #%d: string expected.\n"), "prompt", 1);
             return types::Function::Error;
         }
-        SetTemporaryPrompt(wide_string_to_UTF8(in[0]->getAs<types::String>()->get(0)));
+
+        char* pstrPrompt = wide_string_to_UTF8(in[0]->getAs<types::String>()->get(0));
+        if (strlen(pstrPrompt) > PROMPT_SIZE_MAX - 1)
+        {
+            Scierror(999, _("%s: Wrong size for input argument #%d: A Single string of size %d expected.\n"), "prompt", 1, PROMPT_SIZE_MAX - 1);
+            FREE(pstrPrompt);
+            return types::Function::Error;
+        }
+
+        SetTemporaryPrompt(pstrPrompt);
+        FREE(pstrPrompt);
     }
 
     return types::Function::OK;
index 1d79b8f..ab15194 100644 (file)
@@ -10,13 +10,18 @@ curprompt = prompt();
 if curprompt <> ascii([45.    45.    62.    32.]) then bugmes();quit;end
 [curprompt, pause_level] = prompt();
 if curprompt <> ascii([45.    45.    62.    32.]) then bugmes();quit;end
-if pause_level <> 0 then bugmes();quit;end
+assert_checkequal(pause_level, 0);
 prompt("-- My Prompt -->");
 1+1;
 ierr = execstr("[a,b,c] = prompt();","errcatch");
-if ierr <> 999 then bugmes();quit;end
+assert_checkequal(ierr, 999);
 ierr = execstr("[a,b] = prompt(1);","errcatch");
-if ierr <> 999 then bugmes();quit;end
+assert_checkequal(ierr, 999);
 ierr = execstr("[a,b] = prompt(''1'');","errcatch");
-if ierr <> 999 then bugmes();quit;end
-// =============================================================================
+assert_checkequal(ierr, 999);
+ierr = execstr("prompt(""1234567890123456789012345678901234567890123456789012345678901234"");","errcatch");
+assert_checkequal(ierr, 999);
+ierr = execstr("prompt(""123456789012345678901234567890123456789012345678901234567890123"");","errcatch");
+assert_checkequal(ierr, 0);
+ierr = execstr("prompt(""这段文字很长这段文字很长这段文字很长这段文字很长这段文字很长"");", "errcatch");
+assert_checkequal(ierr, 999);
index acfa3e1..17996e8 100644 (file)
@@ -11,18 +11,26 @@ if curprompt <> ascii([45.    45.    62.    32.]) then pause,end
 
 [curprompt, pause_level] = prompt();
 if curprompt <> ascii([45.    45.    62.    32.]) then pause,end
-if pause_level <> 0 then pause,end
+assert_checkequal(pause_level, 0);
 
 prompt("-- My Prompt -->");
 1+1;
 
 ierr = execstr("[a,b,c] = prompt();","errcatch");
-if ierr <> 999 then pause,end
+assert_checkequal(ierr, 999);
 
 ierr = execstr("[a,b] = prompt(1);","errcatch");
-if ierr <> 999 then pause,end
+assert_checkequal(ierr, 999);
 
 ierr = execstr("[a,b] = prompt(''1'');","errcatch");
-if ierr <> 999 then pause,end
-// =============================================================================
+assert_checkequal(ierr, 999);
+
+ierr = execstr("prompt(""1234567890123456789012345678901234567890123456789012345678901234"");","errcatch");
+assert_checkequal(ierr, 999);
+
+ierr = execstr("prompt(""123456789012345678901234567890123456789012345678901234567890123"");","errcatch");
+assert_checkequal(ierr, 0);
+
+ierr = execstr("prompt(""这段文字很长这段文字很长这段文字很长这段文字很长这段文字很长"");", "errcatch");
+assert_checkequal(ierr, 999);
 
index a50dd0c..4c1a271 100644 (file)
@@ -46,7 +46,8 @@ function [x] = input(msg, flag)
             error(msprintf(gettext("%s: Wrong value for input argument #%d: ''%s'' value expected.\n"),"input",2,"string"));
         end
 
-        prompt(msg);
+        prompt("");
+        mprintf(msg);
         x = mscanf(fmt);
 
         currentpromptAfter = prompt();
@@ -59,7 +60,8 @@ function [x] = input(msg, flag)
 
     else
         while %t
-            prompt(msg);
+            prompt("");
+            mprintf(msg);
             x = mscanf(fmt);
 
             currentpromptAfter = prompt();
diff --git a/scilab/modules/io/tests/nonreg_tests/bug_14375.tst b/scilab/modules/io/tests/nonreg_tests/bug_14375.tst
new file mode 100644 (file)
index 0000000..b1b5474
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- INTERACTIVE TEST -->
+//
+// <-- Non-regression test for bug 14375 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14375
+//
+// <-- Short Description -->
+//    Calling input function with a argument of 64 characters or more crashed Scilab.
+
+a=input("How can this line cause Scilab 6.0.0 Beta to crash when pressing enter?:");
+// Please type : 65
+// and check that a==65
+assert_checkequal(a, 65);