Bug 12909 fixed: Completion on (mt)list led to a crash 86/12486/2
Calixte DENIZET [Wed, 11 Sep 2013 09:58:30 +0000 (11:58 +0200)]
Change-Id: I15df9b46037e6ad8e4f72c009492d5edc0bf90c0

scilab/CHANGES_5.5.X
scilab/modules/completion/src/c/getfieldsdictionary.c
scilab/modules/completion/src/cpp/FieldsManager.cpp
scilab/modules/completion/src/cpp/StructFieldsGetter.cpp
scilab/modules/console/src/c/cmdLine/autoCompletionCli.c

index 97433a9..98c73b5 100644 (file)
@@ -647,3 +647,5 @@ Bug fixes
 * Bug #12863 fixed - size(state-space, "r") returned an error.
 
 * Bug #12875 fixed - phasemag() returned an error for input vector containing zeros.
+
+* Bug #12909 fixed - Completion on (mt)list led to a crash.
index 2218904..21236ac 100644 (file)
@@ -91,16 +91,18 @@ char **getfieldsdictionary(char *lineBeforeCaret, char *pattern, int *size)
         getVarAddressFromName(pvApiCtx, fieldPath[0], &piAddr);
         if (sciErr.iErr)
         {
+            freeArrayOfString(fieldPath, fieldPathLen);
             return NULL;
         }
 
         fields = (char**)getFields(piAddr, fieldPath, fieldPathLen, &fieldsSize);
+        freeArrayOfString(fieldPath, fieldPathLen);
         if (!fields)
         {
             return NULL;
         }
 
-        _fields = (char**)MALLOC(sizeof(char *) * fieldsSize);
+        _fields = (char**)MALLOC(sizeof(char *) * (fieldsSize + 1));
         last = 0;
 
         for (i = 0; i < fieldsSize ; i++)
@@ -120,6 +122,7 @@ char **getfieldsdictionary(char *lineBeforeCaret, char *pattern, int *size)
 
         *size = last;
         qsort(_fields, *size, sizeof(char*), cmpNames);
+        _fields[last] = NULL; // don't forget, it SWIG is using first NULL item to guess array size
 
         return _fields;
     }
index 10c586e..4a29806 100644 (file)
@@ -128,13 +128,15 @@ char ** FieldsManager::getFieldPath(const char * _str, int * len)
 finish :
 
     *len = (int)v.size();
-    ret = (char **) malloc(sizeof(char *) **len);
-    for (int i = 0; i < *len; i++)
+    if (*len != 0)
     {
-        ret[i] = strdup(v.at(*len - i - 1).c_str());
+        ret = (char **) malloc(sizeof(char *) **len);
+        for (int i = 0; i < *len; i++)
+        {
+            ret[i] = strdup(v.at(*len - i - 1).c_str());
+        }
     }
 
-
     return ret;
 }
 }
index 4a40a9b..98a5f05 100644 (file)
@@ -78,6 +78,7 @@ const char ** StructFieldsGetter::getFieldsName(int * mlist, char ** fieldPath,
         memcpy(fields, pstData + 2, sizeof(char *) **fieldsSize);
         FREE(pstData[0]);
         FREE(pstData[1]);
+        FREE(pstData);
 
         return fields;
     }
@@ -98,6 +99,8 @@ const char ** StructFieldsGetter::getFieldsName(int * mlist, char ** fieldPath,
         }
     }
 
+    freeArrayOfString(pstData, rc);
+
     return 0;
 }
 }
index 140695e..822a672 100644 (file)
@@ -475,6 +475,8 @@ static void TermCompletionOnAll(char *lineBeforeCaret, char *lineAfterCaret, cha
 
                     CopyLineAtPrompt(wk_buf, buflinetmp, cursor, cursor_max);
                 }
+
+                freeArrayOfString(completionDictionary, 1);
             }
             else
             {