components/vim/vim72-patches/7.2.016
changeset 379 c6a17bba1da3
parent 378 f0b61ed1d10d
child 380 e92b3b4a1c66
equal deleted inserted replaced
378:f0b61ed1d10d 379:c6a17bba1da3
     1 To: [email protected]
       
     2 Subject: Patch 7.2.016
       
     3 Fcc: outbox
       
     4 From: Bram Moolenaar <[email protected]>
       
     5 Mime-Version: 1.0
       
     6 Content-Type: text/plain; charset=ISO-8859-1
       
     7 Content-Transfer-Encoding: 8bit
       
     8 ------------
       
     9 
       
    10 Patch 7.2.016
       
    11 Problem:    The pattern being completed may be in freed memory when the
       
    12 	    command line is being reallocated. (Dominique Pelle)
       
    13 Solution:   Keep a pointer to the expand_T in the command line structure.
       
    14 	    Don't use <S-Tab> as CTRL-P when there are no results.  Clear the
       
    15 	    completion when using a command line from the history.
       
    16 Files:	    src/ex_getln.c
       
    17 
       
    18 
       
    19 *** ../vim-7.2.015/src/ex_getln.c	Fri Aug  8 12:58:59 2008
       
    20 --- src/ex_getln.c	Wed Sep 10 22:43:41 2008
       
    21 ***************
       
    22 *** 31,36 ****
       
    23 --- 31,38 ----
       
    24       int		cmdattr;	/* attributes for prompt */
       
    25       int		overstrike;	/* Typing mode on the command line.  Shared by
       
    26   				   getcmdline() and put_on_cmdline(). */
       
    27 +     expand_T	*xpc;		/* struct being used for expansion, xp_pattern
       
    28 + 				   may point into cmdbuff */
       
    29       int		xp_context;	/* type of expansion */
       
    30   # ifdef FEAT_EVAL
       
    31       char_u	*xp_arg;	/* user-defined expansion arg */
       
    32 ***************
       
    33 *** 38,44 ****
       
    34   # endif
       
    35   };
       
    36   
       
    37 ! static struct cmdline_info ccline;	/* current cmdline_info */
       
    38   
       
    39   static int	cmd_showtail;		/* Only show path tail in lists ? */
       
    40   
       
    41 --- 40,50 ----
       
    42   # endif
       
    43   };
       
    44   
       
    45 ! /* The current cmdline_info.  It is initialized in getcmdline() and after that
       
    46 !  * used by other functions.  When invoking getcmdline() recursively it needs
       
    47 !  * to be saved with save_cmdline() and restored with restore_cmdline().
       
    48 !  * TODO: make it local to getcmdline() and pass it around. */
       
    49 ! static struct cmdline_info ccline;
       
    50   
       
    51   static int	cmd_showtail;		/* Only show path tail in lists ? */
       
    52   
       
    53 ***************
       
    54 *** 238,243 ****
       
    55 --- 244,250 ----
       
    56       }
       
    57   
       
    58       ExpandInit(&xpc);
       
    59 +     ccline.xpc = &xpc;
       
    60   
       
    61   #ifdef FEAT_RIGHTLEFT
       
    62       if (curwin->w_p_rl && *curwin->w_p_rlc == 's'
       
    63 ***************
       
    64 *** 408,416 ****
       
    65   #endif
       
    66   
       
    67   	/*
       
    68 ! 	 * <S-Tab> works like CTRL-P (unless 'wc' is <S-Tab>).
       
    69   	 */
       
    70 ! 	if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles != -1)
       
    71   	    c = Ctrl_P;
       
    72   
       
    73   #ifdef FEAT_WILDMENU
       
    74 --- 415,424 ----
       
    75   #endif
       
    76   
       
    77   	/*
       
    78 ! 	 * When there are matching completions to select <S-Tab> works like
       
    79 ! 	 * CTRL-P (unless 'wc' is <S-Tab>).
       
    80   	 */
       
    81 ! 	if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles > 0)
       
    82   	    c = Ctrl_P;
       
    83   
       
    84   #ifdef FEAT_WILDMENU
       
    85 ***************
       
    86 *** 1513,1518 ****
       
    87 --- 1521,1527 ----
       
    88   		    int		old_firstc;
       
    89   
       
    90   		    vim_free(ccline.cmdbuff);
       
    91 + 		    xpc.xp_context = EXPAND_NOTHING;
       
    92   		    if (hiscnt == hislen)
       
    93   			p = lookfor;	/* back to the old one */
       
    94   		    else
       
    95 ***************
       
    96 *** 1839,1844 ****
       
    97 --- 1848,1854 ----
       
    98   #endif
       
    99   
       
   100       ExpandCleanup(&xpc);
       
   101 +     ccline.xpc = NULL;
       
   102   
       
   103   #ifdef FEAT_SEARCH_EXTRA
       
   104       if (did_incsearch)
       
   105 ***************
       
   106 *** 2508,2513 ****
       
   107 --- 2518,2537 ----
       
   108       }
       
   109       mch_memmove(ccline.cmdbuff, p, (size_t)ccline.cmdlen + 1);
       
   110       vim_free(p);
       
   111 + 
       
   112 +     if (ccline.xpc != NULL
       
   113 + 	    && ccline.xpc->xp_pattern != NULL
       
   114 + 	    && ccline.xpc->xp_context != EXPAND_NOTHING
       
   115 + 	    && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL)
       
   116 +     {
       
   117 + 	int i = ccline.xpc->xp_pattern - p;
       
   118 + 
       
   119 + 	/* If xp_pattern points inside the old cmdbuff it needs to be adjusted
       
   120 + 	 * to point into the newly allocated memory. */
       
   121 + 	if (i >= 0 && i <= ccline.cmdlen)
       
   122 + 	    ccline.xpc->xp_pattern = ccline.cmdbuff + i;
       
   123 +     }
       
   124 + 
       
   125       return OK;
       
   126   }
       
   127   
       
   128 ***************
       
   129 *** 2875,2880 ****
       
   130 --- 2899,2905 ----
       
   131       prev_ccline = ccline;
       
   132       ccline.cmdbuff = NULL;
       
   133       ccline.cmdprompt = NULL;
       
   134 +     ccline.xpc = NULL;
       
   135   }
       
   136   
       
   137   /*
       
   138 ***************
       
   139 *** 3582,3587 ****
       
   140 --- 3607,3613 ----
       
   141   ExpandInit(xp)
       
   142       expand_T	*xp;
       
   143   {
       
   144 +     xp->xp_pattern = NULL;
       
   145       xp->xp_backslash = XP_BS_NONE;
       
   146   #ifndef BACKSLASH_IN_FILENAME
       
   147       xp->xp_shell = FALSE;
       
   148 *** ../vim-7.2.015/src/version.c	Wed Sep 10 18:25:18 2008
       
   149 --- src/version.c	Sun Sep 14 14:38:47 2008
       
   150 ***************
       
   151 *** 678,679 ****
       
   152 --- 678,681 ----
       
   153   {   /* Add new patch number below this line */
       
   154 + /**/
       
   155 +     16,
       
   156   /**/
       
   157 
       
   158 -- 
       
   159 hundred-and-one symptoms of being an internet addict:
       
   160 53. To find out what time it is, you send yourself an e-mail and check the
       
   161     "Date:" field.
       
   162 
       
   163  /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
       
   164 ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
       
   165 \\\        download, build and distribute -- http://www.A-A-P.org        ///
       
   166  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///