Bug 13226 fixed: Completion with accentued chars could lead to a a crash 62/13662/4
Calixte DENIZET [Wed, 5 Feb 2014 10:23:09 +0000 (11:23 +0100)]
Change-Id: Ia21555f008711c9c64981efe3a5745a86b07dbb9

scilab/CHANGES_5.5.X
scilab/modules/console/src/c/cmdLine/autoCompletionCli.c
scilab/modules/console/tests/nonreg_tests/bug_13226.c [new file with mode: 0644]
scilab/modules/console/tests/nonreg_tests/bug_13226.dia.ref [new file with mode: 0644]
scilab/modules/console/tests/nonreg_tests/bug_13226.tst [new file with mode: 0644]

index 1ab014e..734b19d 100644 (file)
@@ -480,6 +480,8 @@ Scilab Bug Fixes
 
 * Bug #13218 fixed - Typos fixed in core module help pages.
 
+* Bug #13226 fixed - Completion with accentued chars could lead to a crash.
+
 
 Xcos
 ====
index 85bea2f..f6de606 100644 (file)
@@ -1,13 +1,13 @@
 /*
-* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-* Copyright (C) 2011 - DIGITEO - Karim Mamode
-*
-* This file must be used under the terms of the CeCILL.
-* This source file is licensed as described in the file COPYING, which
-* you should have received as part of this distribution.  The terms
-* are also available at
-* http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-*/
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Karim Mamode
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+ */
 
 #include <string.h>
 #include <wchar.h>
@@ -62,7 +62,6 @@ static char **concatenateStrings(int *sizearrayofstring, char *string1, char *st
 void autoCompletionInConsoleMode(wchar_t ** commandLine, unsigned int *cursorLocation)
 {
     char *multiByteString = NULL;
-
     wchar_t *wideString = NULL;
 
     int sizeToAlloc = 0;
@@ -86,15 +85,10 @@ void autoCompletionInConsoleMode(wchar_t ** commandLine, unsigned int *cursorLoc
 static void doCompletion(char **wk_buf, unsigned int *cursor, unsigned int *cursor_max)
 {
     char *LineBeforeCaret = getLineBeforeCaret(*wk_buf, cursor);
-
     char *LineAfterCaret = getLineAfterCaret(*wk_buf, cursor, cursor_max);
-
     char *fileSearchedPattern = getFilePartLevel(LineBeforeCaret);
-
     char *SearchedPattern = getPartLevel(LineBeforeCaret);
-
     char **completionDictionaryFiles = NULL;
-
     int sizecompletionDictionaryFiles = 0;
 
     completionDictionaryFiles = completionOnFiles(fileSearchedPattern, &sizecompletionDictionaryFiles);
@@ -135,9 +129,11 @@ static void doCompletion(char **wk_buf, unsigned int *cursor, unsigned int *curs
 static char *getLineBeforeCaret(char *wk_buf, unsigned int *cursor)
 {
     char *line = NULL;
+    wchar_t * wtmp = to_wide_string(wk_buf);
 
-    line = strdup(wk_buf);
-    line[*cursor] = '\0';
+    wtmp[*cursor] = 0;
+    line = wide_string_to_UTF8(wtmp);
+    FREE(wtmp);
 
     return line;
 }
@@ -149,12 +145,14 @@ static char *getLineAfterCaret(char *wk_buf, unsigned int *cursor, unsigned int
         if (*cursor != *cursor_max)
         {
             int len = *cursor_max - *cursor;
+            wchar_t * wtmp = to_wide_string(wk_buf);
+            wchar_t aftercaret[WK_BUF_SIZE];
 
-            char aftercaret[WK_BUF_SIZE];
-
-            strcpy(aftercaret, &wk_buf[*cursor]);
+            wcscpy(aftercaret, &wtmp[*cursor]);
             aftercaret[len + 1] = '\0';
-            return strdup(aftercaret);
+            FREE(wtmp);
+
+            return wide_string_to_UTF8(aftercaret);
         }
     }
     return strdup("");
@@ -294,13 +292,16 @@ static int CopyLineAtPrompt(char **wk_buf, char *line, unsigned int *cursor, uns
     FREE(*wk_buf);
     if (line)
     {
+        wchar_t *wtmp = NULL;
         //** Copy line to current command buffer, usefull in completion case.
         *wk_buf = MALLOC(sizeof(char) * strlen(line) + 1);
         strcpy(*wk_buf, line);
         backspace(*cursor);     /* backspace to beginning of line */
         printf("%s", *wk_buf);   /* copy to screen */
 
-        *cursor = strlen(*wk_buf);   /* cursor set at end of line */
+        wtmp = to_wide_string(*wk_buf);
+        *cursor = wcslen(wtmp); /* cursor set at end of line */
+        FREE(wtmp);
 
         /* erase extra characters left over if any */
         erase_nchar(GET_MAX(0, (*cursor_max - *cursor)));
diff --git a/scilab/modules/console/tests/nonreg_tests/bug_13226.c b/scilab/modules/console/tests/nonreg_tests/bug_13226.c
new file mode 100644 (file)
index 0000000..d0fa9c9
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) Scilab Enterprises - 2014 - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+ *
+ */
+
+#include <wchar.h>
+
+#include "api_scilab.h"
+#include "Scierror.h"
+#include "autoCompletionCli.h"
+#include "MALLOC.h"
+
+/*--------------------------------------------------------------------------*/
+int sci_completecommandline(char *fname, unsigned long fname_len)
+{
+    SciErr err;
+    int * addr = NULL;
+    wchar_t * wstr = NULL;
+    wchar_t * commandLine = MALLOC(sizeof(wchar_t) * 1024);
+    double c;
+    unsigned int cursor;
+
+    CheckOutputArgument(pvApiCtx, 2, 2);
+    CheckInputArgument(pvApiCtx, 2, 2);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    getAllocatedSingleWideString(pvApiCtx, addr, &wstr);
+    err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+    getScalarDouble(pvApiCtx, addr, &c);
+
+    cursor = (unsigned int)c;
+
+    wcscpy(commandLine, wstr);
+    freeAllocatedSingleWideString(wstr);
+
+    autoCompletionInConsoleMode(&commandLine, &cursor);
+
+    createSingleWideString(pvApiCtx, 3, commandLine);
+    createScalarDouble(pvApiCtx, 4, (double)cursor);
+
+    FREE(commandLine);
+
+    AssignOutputVariable(pvApiCtx, 1) = 3;
+    AssignOutputVariable(pvApiCtx, 2) = 4;
+
+    return 0;
+}
diff --git a/scilab/modules/console/tests/nonreg_tests/bug_13226.dia.ref b/scilab/modules/console/tests/nonreg_tests/bug_13226.dia.ref
new file mode 100644 (file)
index 0000000..ce7caca
--- /dev/null
@@ -0,0 +1,56 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 13226 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13226
+//
+// <-- Short Description -->
+// Completion with accentued chars could lead to a a crash
+file_path = SCI + "/modules/console/tests/nonreg_tests/";
+mkdir(TMPDIR + "/console");
+cd(TMPDIR + "/console");
+ilib_verbose(0);
+ilib_name   = "console_c";
+files       = "bug_13226.c";
+for i = 1 : size(files, "*")
+    copyfile(file_path + "/" + files(i), TMPDIR + "/console");
+end
+if getos() == "Windows" then
+    libs   = SCI   + "/bin/sciconsole";
+    cflags = "-I " + SCI +"/modules/console/includes";
+elseif isdir(SCI+"/modules/console/includes")
+    // Unix source version
+    libs   = SCI + "/modules/console/.libs/libsciconsole";
+    cflags = "-I " + SCI +"/modules/console/includes -I " + SCI + "/modules/localization/includes";
+else
+    // Unix binary version
+    SCI_LIB     = strsubst(SCI,"/share\/scilab$/","lib/scilab"     ,"r");
+    SCI_INCLUDE = strsubst(SCI,"/share\/scilab$/","include/scilab" ,"r");
+    libs        = SCI_LIB + "/libsciconsole";
+    cflags      = "-I " + SCI_INCLUDE
+end
+// name known in scilab , C function called
+table = ["completecommandline"    ,"sci_completecommandline"];
+libname = ilib_build(ilib_name,table,files,libs,[],"",cflags);
+clear ilib_build;
+clear libname;
+clear table;
+clear libs;
+clear files;
+clear ilib_name;
+clear gateway_c_dir;
+clear SCI_LIB;
+clear SCI_INCLUDE;
+ierr = exec(TMPDIR + "/console/loader.sce", "errcatch", -1);
+createdir(TMPDIR+"/Téléchargements");
+mputl("",TMPDIR+"/Téléchargements/foo.bar");
+cd(TMPDIR);
+[r,c] = completecommandline("atomsInstall(""./Téléchargements/f",33);
+assert_checkequal(r,"atomsInstall(""./Téléchargements/foo.bar");
+assert_checkequal(c,39);
diff --git a/scilab/modules/console/tests/nonreg_tests/bug_13226.tst b/scilab/modules/console/tests/nonreg_tests/bug_13226.tst
new file mode 100644 (file)
index 0000000..d51345d
--- /dev/null
@@ -0,0 +1,68 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+//
+// <-- Non-regression test for bug 13226 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13226
+//
+// <-- Short Description -->
+// Completion with accentued chars could lead to a a crash
+
+file_path = SCI + "/modules/console/tests/nonreg_tests/";
+mkdir(TMPDIR + "/console");
+cd(TMPDIR + "/console");
+
+ilib_verbose(0);
+ilib_name   = "console_c";
+files       = "bug_13226.c";
+
+for i = 1 : size(files, "*")
+    copyfile(file_path + "/" + files(i), TMPDIR + "/console");
+end
+
+if getos() == "Windows" then
+    libs   = SCI   + "/bin/sciconsole";
+    cflags = "-I " + SCI +"/modules/console/includes";
+
+elseif isdir(SCI+"/modules/console/includes")
+    // Unix source version
+    libs   = SCI + "/modules/console/.libs/libsciconsole";
+    cflags = "-I " + SCI +"/modules/console/includes -I " + SCI + "/modules/localization/includes";
+
+else
+    // Unix binary version
+    SCI_LIB     = strsubst(SCI,"/share\/scilab$/","lib/scilab"     ,"r");
+    SCI_INCLUDE = strsubst(SCI,"/share\/scilab$/","include/scilab" ,"r");
+    libs        = SCI_LIB + "/libsciconsole";
+    cflags      = "-I " + SCI_INCLUDE
+end
+
+// name known in scilab , C function called
+table = ["completecommandline"    ,"sci_completecommandline"];
+libname = ilib_build(ilib_name,table,files,libs,[],"",cflags);
+
+clear ilib_build;
+clear libname;
+clear table;
+clear libs;
+clear files;
+clear ilib_name;
+clear gateway_c_dir;
+clear SCI_LIB;
+clear SCI_INCLUDE;
+
+ierr = exec(TMPDIR + "/console/loader.sce", "errcatch", -1);
+
+createdir(TMPDIR+"/Téléchargements");
+mputl("",TMPDIR+"/Téléchargements/foo.bar");
+cd(TMPDIR);
+
+[r,c] = completecommandline("atomsInstall(""./Téléchargements/f",33);
+assert_checkequal(r,"atomsInstall(""./Téléchargements/foo.bar");
+assert_checkequal(c,39);