changeset 2227:9c510840e896 vim73

updated for version 7.2.439 Problem: Invalid memory access when doing thesaurus completion and 'infercase' is set. Solution: Use the minimal length of completed word and replacement. (Dominique Pelle)
author Bram Moolenaar <bram@vim.org>
date Fri, 28 May 2010 21:31:58 +0200
parents 36a9ac99e1ca
children f5bd6753cdc4
files src/edit.c
diffstat 1 files changed, 9 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/edit.c
+++ b/src/edit.c
@@ -2164,6 +2164,7 @@ ins_compl_add_infercase(str, len, icase,
     int		i, c;
     int		actual_len;		/* Take multi-byte characters */
     int		actual_compl_length;	/* into account. */
+    int		min_len;
     int		*wca;			/* Wide character array. */
     int		has_lower = FALSE;
     int		was_letter = FALSE;
@@ -2204,6 +2205,11 @@ ins_compl_add_infercase(str, len, icase,
 #endif
 	    actual_compl_length = compl_length;
 
+	/* "actual_len" may be smaller than "actual_compl_length" when using
+	 * thesaurus, only use the minimum when comparing. */
+	min_len = actual_len < actual_compl_length
+					   ? actual_len : actual_compl_length;
+
 	/* Allocate wide character array for the completion and fill it. */
 	wca = (int *)alloc((unsigned)(actual_len * sizeof(int)));
 	if (wca != NULL)
@@ -2219,7 +2225,7 @@ ins_compl_add_infercase(str, len, icase,
 
 	    /* Rule 1: Were any chars converted to lower? */
 	    p = compl_orig_text;
-	    for (i = 0; i < actual_compl_length; ++i)
+	    for (i = 0; i < min_len; ++i)
 	    {
 #ifdef FEAT_MBYTE
 		if (has_mbyte)
@@ -2247,7 +2253,7 @@ ins_compl_add_infercase(str, len, icase,
 	    if (!has_lower)
 	    {
 		p = compl_orig_text;
-		for (i = 0; i < actual_compl_length; ++i)
+		for (i = 0; i < min_len; ++i)
 		{
 #ifdef FEAT_MBYTE
 		    if (has_mbyte)
@@ -2268,7 +2274,7 @@ ins_compl_add_infercase(str, len, icase,
 
 	    /* Copy the original case of the part we typed. */
 	    p = compl_orig_text;
-	    for (i = 0; i < actual_compl_length; ++i)
+	    for (i = 0; i < min_len; ++i)
 	    {
 #ifdef FEAT_MBYTE
 		if (has_mbyte)