summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0439
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0439')
-rw-r--r--data/vim/patches/8.1.0439600
1 files changed, 600 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0439 b/data/vim/patches/8.1.0439
new file mode 100644
index 000000000..98670415a
--- /dev/null
+++ b/data/vim/patches/8.1.0439
@@ -0,0 +1,600 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0439
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0439
+Problem: Recursive use of getcmdline() still not protected.
+Solution: Instead of saving the command buffer when making a call which may
+ cause recursiveness, save the buffer when actually being called
+ recursively.
+Files: src/ex_getln.c, src/proto/ex_getln.pro, src/getchar.c, src/main.c
+
+
+*** ../vim-8.1.0438/src/ex_getln.c 2018-09-25 22:27:31.958075001 +0200
+--- src/ex_getln.c 2018-09-30 17:09:47.106527162 +0200
+***************
+*** 44,56 ****
+ # endif
+ };
+
+! /* The current cmdline_info. It is initialized in getcmdline() and after that
+! * used by other functions. When invoking getcmdline() recursively it needs
+! * to be saved with save_cmdline() and restored with restore_cmdline().
+! * TODO: make it local to getcmdline() and pass it around. */
+ static struct cmdline_info ccline;
+
+! static int cmd_showtail; /* Only show path tail in lists ? */
+
+ #ifdef FEAT_EVAL
+ static int new_cmdpos; /* position set by set_cmdline_pos() */
+--- 44,55 ----
+ # endif
+ };
+
+! // The current cmdline_info. It is initialized in getcmdline() and after that
+! // used by other functions. When invoking getcmdline() recursively it needs
+! // to be saved with save_cmdline() and restored with restore_cmdline().
+ static struct cmdline_info ccline;
+
+! static int cmd_showtail; /* Only show path tail in lists ? */
+
+ #ifdef FEAT_EVAL
+ static int new_cmdpos; /* position set by set_cmdline_pos() */
+***************
+*** 91,96 ****
+--- 90,96 ----
+ static int cmd_fkmap = 0; /* Farsi mapping during command line */
+ #endif
+
++ static char_u *getcmdline_int(int firstc, long count, int indent, int init_ccline);
+ static int cmdline_charsize(int idx);
+ static void set_cmdspos(void);
+ static void set_cmdspos_cursor(void);
+***************
+*** 463,469 ****
+ int skiplen, patlen;
+ int found; // do_search() result
+ pos_T end_pos;
+- struct cmdline_info save_ccline;
+ #ifdef FEAT_RELTIME
+ proftime_T tm;
+ #endif
+--- 463,468 ----
+***************
+*** 601,609 ****
+ if (p_ru && curwin->w_status_height > 0)
+ curwin->w_redr_status = TRUE;
+
+- save_cmdline(&save_ccline);
+ update_screen(SOME_VALID);
+- restore_cmdline(&save_ccline);
+ restore_last_search_pattern();
+
+ // Leave it at the end to make CTRL-R CTRL-W work. But not when beyond the
+--- 600,606 ----
+***************
+*** 800,807 ****
+ char_u *
+ getcmdline(
+ int firstc,
+! long count UNUSED, /* only used for incremental search */
+! int indent) /* indent for inside conditionals */
+ {
+ int c;
+ int i;
+--- 797,814 ----
+ char_u *
+ getcmdline(
+ int firstc,
+! long count, // only used for incremental search
+! int indent) // indent for inside conditionals
+! {
+! return getcmdline_int(firstc, count, indent, TRUE);
+! }
+!
+! static char_u *
+! getcmdline_int(
+! int firstc,
+! long count UNUSED, // only used for incremental search
+! int indent, // indent for inside conditionals
+! int init_ccline) // clear ccline first
+ {
+ int c;
+ int i;
+***************
+*** 832,845 ****
+ #endif
+ expand_T xpc;
+ long *b_im_ptr = NULL;
+- #if defined(FEAT_WILDMENU) || defined(FEAT_EVAL)
+- /* Everything that may work recursively should save and restore the
+- * current command line in save_ccline. That includes update_screen(), a
+- * custom status line may invoke ":normal". */
+ struct cmdline_info save_ccline;
+! #endif
+ int cmdline_type;
+
+ #ifdef FEAT_EVAL
+ if (firstc == -1)
+ {
+--- 839,858 ----
+ #endif
+ expand_T xpc;
+ long *b_im_ptr = NULL;
+ struct cmdline_info save_ccline;
+! int did_save_ccline = FALSE;
+ int cmdline_type;
+
++ if (ccline.cmdbuff != NULL)
++ {
++ // Being called recursively. Since ccline is global, we need to save
++ // the current buffer and restore it when returning.
++ save_cmdline(&save_ccline);
++ did_save_ccline = TRUE;
++ }
++ if (init_ccline)
++ vim_memset(&ccline, 0, sizeof(struct cmdline_info));
++
+ #ifdef FEAT_EVAL
+ if (firstc == -1)
+ {
+***************
+*** 868,874 ****
+ /* alloc initial ccline.cmdbuff */
+ alloc_cmdbuff(exmode_active ? 250 : indent + 1);
+ if (ccline.cmdbuff == NULL)
+! return NULL; /* out of memory */
+ ccline.cmdlen = ccline.cmdpos = 0;
+ ccline.cmdbuff[0] = NUL;
+ sb_text_start_cmdline();
+--- 881,887 ----
+ /* alloc initial ccline.cmdbuff */
+ alloc_cmdbuff(exmode_active ? 250 : indent + 1);
+ if (ccline.cmdbuff == NULL)
+! goto theend; // out of memory
+ ccline.cmdlen = ccline.cmdpos = 0;
+ ccline.cmdbuff[0] = NUL;
+ sb_text_start_cmdline();
+***************
+*** 1125,1133 ****
+ p_ls = save_p_ls;
+ p_wmh = save_p_wmh;
+ last_status(FALSE);
+- save_cmdline(&save_ccline);
+ update_screen(VALID); /* redraw the screen NOW */
+- restore_cmdline(&save_ccline);
+ redrawcmd();
+ save_p_ls = -1;
+ }
+--- 1138,1144 ----
+***************
+*** 1333,1351 ****
+ else
+ new_cmdpos = ccline.cmdpos;
+
+- save_cmdline(&save_ccline);
+ c = get_expr_register();
+- restore_cmdline(&save_ccline);
+ if (c == '=')
+ {
+ /* Need to save and restore ccline. And set "textlock"
+ * to avoid nasty things like going to another buffer when
+ * evaluating an expression. */
+- save_cmdline(&save_ccline);
+ ++textlock;
+ p = get_expr_line();
+ --textlock;
+- restore_cmdline(&save_ccline);
+
+ if (p != NULL)
+ {
+--- 1344,1358 ----
+***************
+*** 1812,1822 ****
+ c = ESC;
+ }
+ else
+- {
+- save_cmdline(&save_ccline);
+ c = get_expr_register();
+- restore_cmdline(&save_ccline);
+- }
+ }
+ #endif
+ if (c != ESC) /* use ESC to cancel inserting register */
+--- 1819,1825 ----
+***************
+*** 2187,2193 ****
+ int len;
+ int old_firstc;
+
+! vim_free(ccline.cmdbuff);
+ xpc.xp_context = EXPAND_NOTHING;
+ if (hiscnt == hislen)
+ p = lookfor; /* back to the old one */
+--- 2190,2196 ----
+ int len;
+ int old_firstc;
+
+! VIM_CLEAR(ccline.cmdbuff);
+ xpc.xp_context = EXPAND_NOTHING;
+ if (hiscnt == hislen)
+ p = lookfor; /* back to the old one */
+***************
+*** 2486,2496 ****
+ #endif
+ sb_text_end_cmdline();
+
+ {
+ char_u *p = ccline.cmdbuff;
+
+! /* Make ccline empty, getcmdline() may try to use it. */
+! ccline.cmdbuff = NULL;
+ return p;
+ }
+ }
+--- 2489,2502 ----
+ #endif
+ sb_text_end_cmdline();
+
++ theend:
+ {
+ char_u *p = ccline.cmdbuff;
+
+! if (did_save_ccline)
+! restore_cmdline(&save_ccline);
+! else
+! ccline.cmdbuff = NULL;
+ return p;
+ }
+ }
+***************
+*** 2512,2521 ****
+ {
+ char_u *s;
+ struct cmdline_info save_ccline;
+ int msg_col_save = msg_col;
+ int msg_silent_save = msg_silent;
+
+! save_cmdline(&save_ccline);
+ ccline.cmdprompt = prompt;
+ ccline.cmdattr = attr;
+ # ifdef FEAT_EVAL
+--- 2518,2535 ----
+ {
+ char_u *s;
+ struct cmdline_info save_ccline;
++ int did_save_ccline = FALSE;
+ int msg_col_save = msg_col;
+ int msg_silent_save = msg_silent;
+
+! if (ccline.cmdbuff != NULL)
+! {
+! // Save the values of the current cmdline and restore them below.
+! save_cmdline(&save_ccline);
+! did_save_ccline = TRUE;
+! }
+!
+! vim_memset(&ccline, 0, sizeof(struct cmdline_info));
+ ccline.cmdprompt = prompt;
+ ccline.cmdattr = attr;
+ # ifdef FEAT_EVAL
+***************
+*** 2524,2531 ****
+ ccline.input_fn = (firstc == '@');
+ # endif
+ msg_silent = 0;
+! s = getcmdline(firstc, 1L, 0);
+! restore_cmdline(&save_ccline);
+ msg_silent = msg_silent_save;
+ /* Restore msg_col, the prompt from input() may have changed it.
+ * But only if called recursively and the commandline is therefore being
+--- 2538,2548 ----
+ ccline.input_fn = (firstc == '@');
+ # endif
+ msg_silent = 0;
+! s = getcmdline_int(firstc, 1L, 0, FALSE);
+!
+! if (did_save_ccline)
+! restore_cmdline(&save_ccline);
+!
+ msg_silent = msg_silent_save;
+ /* Restore msg_col, the prompt from input() may have changed it.
+ * But only if called recursively and the commandline is therefore being
+***************
+*** 3121,3127 ****
+ /*
+ * Allocate a new command line buffer.
+ * Assigns the new buffer to ccline.cmdbuff and ccline.cmdbufflen.
+- * Returns the new value of ccline.cmdbuff and ccline.cmdbufflen.
+ */
+ static void
+ alloc_cmdbuff(int len)
+--- 3138,3143 ----
+***************
+*** 3542,3550 ****
+ }
+ *ccp = prev_ccline;
+ prev_ccline = ccline;
+! ccline.cmdbuff = NULL;
+! ccline.cmdprompt = NULL;
+! ccline.xpc = NULL;
+ }
+
+ /*
+--- 3558,3564 ----
+ }
+ *ccp = prev_ccline;
+ prev_ccline = ccline;
+! ccline.cmdbuff = NULL; // signal that ccline is not in use
+ }
+
+ /*
+***************
+*** 3557,3593 ****
+ prev_ccline = *ccp;
+ }
+
+- #if defined(FEAT_EVAL) || defined(PROTO)
+- /*
+- * Save the command line into allocated memory. Returns a pointer to be
+- * passed to restore_cmdline_alloc() later.
+- * Returns NULL when failed.
+- */
+- char_u *
+- save_cmdline_alloc(void)
+- {
+- struct cmdline_info *p;
+-
+- p = (struct cmdline_info *)alloc((unsigned)sizeof(struct cmdline_info));
+- if (p != NULL)
+- save_cmdline(p);
+- return (char_u *)p;
+- }
+-
+- /*
+- * Restore the command line from the return value of save_cmdline_alloc().
+- */
+- void
+- restore_cmdline_alloc(char_u *p)
+- {
+- if (p != NULL)
+- {
+- restore_cmdline((struct cmdline_info *)p);
+- vim_free(p);
+- }
+- }
+- #endif
+-
+ /*
+ * Paste a yank register into the command line.
+ * Used by CTRL-R command in command-line mode.
+--- 3571,3576 ----
+***************
+*** 3606,3612 ****
+ char_u *arg;
+ char_u *p;
+ int allocated;
+- struct cmdline_info save_ccline;
+
+ /* check for valid regname; also accept special characters for CTRL-R in
+ * the command line */
+--- 3589,3594 ----
+***************
+*** 3625,3637 ****
+ regname = may_get_selection(regname);
+ #endif
+
+! /* Need to save and restore ccline. And set "textlock" to avoid nasty
+! * things like going to another buffer when evaluating an expression. */
+! save_cmdline(&save_ccline);
+ ++textlock;
+ i = get_spec_reg(regname, &arg, &allocated, TRUE);
+ --textlock;
+- restore_cmdline(&save_ccline);
+
+ if (i)
+ {
+--- 3607,3617 ----
+ regname = may_get_selection(regname);
+ #endif
+
+! // Need to set "textlock" to avoid nasty things like going to another
+! // buffer when evaluating an expression.
+ ++textlock;
+ i = get_spec_reg(regname, &arg, &allocated, TRUE);
+ --textlock;
+
+ if (i)
+ {
+***************
+*** 5601,5607 ****
+ sctx_T save_current_sctx = current_sctx;
+ char_u *pat = NULL;
+ void *ret;
+- struct cmdline_info save_ccline;
+
+ if (xp->xp_arg == NULL || xp->xp_arg[0] == '\0' || xp->xp_line == NULL)
+ return NULL;
+--- 5581,5586 ----
+***************
+*** 5624,5638 ****
+ args[2].vval.v_number = xp->xp_col;
+ args[3].v_type = VAR_UNKNOWN;
+
+- /* Save the cmdline, we don't know what the function may do. */
+- save_ccline = ccline;
+- ccline.cmdbuff = NULL;
+- ccline.cmdprompt = NULL;
+ current_sctx = xp->xp_script_ctx;
+
+ ret = user_expand_func(xp->xp_arg, 3, args);
+
+- ccline = save_ccline;
+ current_sctx = save_current_sctx;
+ if (ccline.cmdbuff != NULL)
+ ccline.cmdbuff[ccline.cmdlen] = keep;
+--- 5603,5612 ----
+***************
+*** 6481,6487 ****
+
+ #if defined(FEAT_EVAL) || defined(FEAT_CMDWIN) || defined(PROTO)
+ /*
+! * Get pointer to the command line info to use. cmdline_paste() may clear
+ * ccline and put the previous value in prev_ccline.
+ */
+ static struct cmdline_info *
+--- 6455,6461 ----
+
+ #if defined(FEAT_EVAL) || defined(FEAT_CMDWIN) || defined(PROTO)
+ /*
+! * Get pointer to the command line info to use. save_ccline() may clear
+ * ccline and put the previous value in prev_ccline.
+ */
+ static struct cmdline_info *
+***************
+*** 7072,7077 ****
+--- 7046,7057 ----
+ }
+ }
+
++ void
++ cmdline_init(void)
++ {
++ vim_memset(&ccline, 0, sizeof(struct cmdline_info));
++ }
++
+ /*
+ * Write history to viminfo file in "fp".
+ * When "merge" is TRUE merge history lines with a previously read viminfo
+***************
+*** 7238,7244 ****
+ static int
+ open_cmdwin(void)
+ {
+- struct cmdline_info save_ccline;
+ bufref_T old_curbuf;
+ win_T *old_curwin = curwin;
+ bufref_T bufref;
+--- 7218,7223 ----
+***************
+*** 7355,7363 ****
+ invalidate_botline();
+ redraw_later(SOME_VALID);
+
+- /* Save the command line info, can be used recursively. */
+- save_cmdline(&save_ccline);
+-
+ /* No Ex mode here! */
+ exmode_active = 0;
+
+--- 7334,7339 ----
+***************
+*** 7394,7403 ****
+ KeyTyped = save_KeyTyped;
+ # endif
+
+- /* Restore the command line info. */
+- restore_cmdline(&save_ccline);
+ cmdwin_type = 0;
+-
+ exmode_active = save_exmode;
+
+ /* Safety check: The old window or buffer was deleted: It's a bug when
+--- 7370,7376 ----
+*** ../vim-8.1.0438/src/proto/ex_getln.pro 2018-05-17 13:52:35.000000000 +0200
+--- src/proto/ex_getln.pro 2018-09-30 15:11:35.810356311 +0200
+***************
+*** 15,22 ****
+ void putcmdline(int c, int shift);
+ void unputcmdline(void);
+ int put_on_cmdline(char_u *str, int len, int redraw);
+- char_u *save_cmdline_alloc(void);
+- void restore_cmdline_alloc(char_u *p);
+ void cmdline_paste_str(char_u *s, int literally);
+ void redrawcmdline(void);
+ void redrawcmdline_ex(int do_compute_cmdrow);
+--- 15,20 ----
+***************
+*** 54,59 ****
+--- 52,58 ----
+ int read_viminfo_history(vir_T *virp, int writing);
+ void handle_viminfo_history(garray_T *values, int writing);
+ void finish_viminfo_history(vir_T *virp);
++ void cmdline_init(void);
+ void write_viminfo_history(FILE *fp, int merge);
+ void cmd_pchar(int c, int offset);
+ int cmd_gchar(int offset);
+*** ../vim-8.1.0438/src/getchar.c 2018-09-10 21:04:09.868392665 +0200
+--- src/getchar.c 2018-09-30 14:32:29.424816910 +0200
+***************
+*** 4666,4672 ****
+ char_u *res;
+ char_u *p;
+ char_u *expr;
+- char_u *save_cmd;
+ pos_T save_cursor;
+ int save_msg_col;
+ int save_msg_row;
+--- 4666,4671 ----
+***************
+*** 4678,4690 ****
+ return NULL;
+ vim_unescape_csi(expr);
+
+- save_cmd = save_cmdline_alloc();
+- if (save_cmd == NULL)
+- {
+- vim_free(expr);
+- return NULL;
+- }
+-
+ /* Forbid changing text or using ":normal" to avoid most of the bad side
+ * effects. Also restore the cursor position. */
+ ++textlock;
+--- 4677,4682 ----
+***************
+*** 4700,4706 ****
+ msg_col = save_msg_col;
+ msg_row = save_msg_row;
+
+- restore_cmdline_alloc(save_cmd);
+ vim_free(expr);
+
+ if (p == NULL)
+--- 4692,4697 ----
+*** ../vim-8.1.0438/src/main.c 2018-09-16 14:10:28.300323360 +0200
+--- src/main.c 2018-09-30 15:10:50.358720630 +0200
+***************
+*** 929,934 ****
+--- 929,935 ----
+ void
+ common_init(mparm_T *paramp)
+ {
++ cmdline_init();
+
+ #ifdef FEAT_MBYTE
+ (void)mb_init(); /* init mb_bytelen_tab[] to ones */
+*** ../vim-8.1.0438/src/version.c 2018-09-28 23:09:50.558463030 +0200
+--- src/version.c 2018-09-30 17:07:43.183446960 +0200
+***************
+*** 796,797 ****
+--- 796,799 ----
+ { /* Add new patch number below this line */
++ /**/
++ 439,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+124. You begin conversations with, "Who is your internet service provider?"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///