To: vim_dev@googlegroups.com Subject: Patch 8.0.1429 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1429 Problem: Crash when calling term_start() with empty argument. Solution: Check for invalid argument. (Yasuhiro Matsomoto, closes #2503) Fix memory leak. Files: src/terminal.c, src/testdir/test_terminal.vim *** ../vim-8.0.1428/src/terminal.c 2017-12-05 21:32:28.943651550 +0100 --- src/terminal.c 2018-01-26 20:02:29.294783413 +0100 *************** *** 42,47 **** --- 42,48 ---- * a job that uses 16 colors while Vim is using > 256. * - in GUI vertical split causes problems. Cursor is flickering. (Hirohito * Higashi, 2017 Sep 19) + * - Trigger TerminalOpen event? #2422 patch in #2484 * - Shift-Tab does not work. * - after resizing windows overlap. (Boris Staletic, #2164) * - Redirecting output does not work on MS-Windows, Test_terminal_redir_file() *************** *** 62,67 **** --- 63,70 ---- * - add test for giving error for invalid 'termsize' value. * - support minimal size when 'termsize' is "rows*cols". * - support minimal size when 'termsize' is empty? + * - if the job in the terminal does not support the mouse, we can use the + * mouse in the Terminal window for copy/paste and scrolling. * - GUI: when using tabs, focus in terminal, click on tab does not work. * - GUI: when 'confirm' is set and trying to exit Vim, dialog offers to save * changes to "!shell". *************** *** 69,76 **** * - Redrawing is slow with Athena and Motif. Also other GUI? (Ramel Eshed) * - For the GUI fill termios with default values, perhaps like pangoterm: * http://bazaar.launchpad.net/~leonerd/pangoterm/trunk/view/head:/main.c#L134 - * - if the job in the terminal does not support the mouse, we can use the - * mouse in the Terminal window for copy/paste. * - when 'encoding' is not utf-8, or the job is using another encoding, setup * conversions. * - In the GUI use a terminal emulator for :!cmd. Make the height the same as --- 72,77 ---- *************** *** 3388,3415 **** void *winpty_err; void *spawn_config = NULL; garray_T ga_cmd, ga_env; ! char_u *cmd; if (dyn_winpty_init(TRUE) == FAIL) return FAIL; if (argvar->v_type == VAR_STRING) cmd = argvar->vval.v_string; ! else { - ga_init2(&ga_cmd, (int)sizeof(char*), 20); if (win32_build_cmd(argvar->vval.v_list, &ga_cmd) == FAIL) goto failed; cmd = ga_cmd.ga_data; } cmd_wchar = enc_to_utf16(cmd, NULL); if (cmd_wchar == NULL) ! return FAIL; if (opt->jo_cwd != NULL) cwd_wchar = enc_to_utf16(opt->jo_cwd, NULL); - ga_init2(&ga_env, (int)sizeof(char*), 20); win32_build_env(opt->jo_env, &ga_env, TRUE); env_wchar = ga_env.ga_data; --- 3389,3424 ---- void *winpty_err; void *spawn_config = NULL; garray_T ga_cmd, ga_env; ! char_u *cmd = NULL; if (dyn_winpty_init(TRUE) == FAIL) return FAIL; + ga_init2(&ga_cmd, (int)sizeof(char*), 20); + ga_init2(&ga_env, (int)sizeof(char*), 20); if (argvar->v_type == VAR_STRING) + { cmd = argvar->vval.v_string; ! } ! else if (argvar->v_type == VAR_LIST) { if (win32_build_cmd(argvar->vval.v_list, &ga_cmd) == FAIL) goto failed; cmd = ga_cmd.ga_data; } + if (cmd == NULL || *cmd == NUL) + { + EMSG(_(e_invarg)); + goto failed; + } cmd_wchar = enc_to_utf16(cmd, NULL); + ga_clear(&ga_cmd); if (cmd_wchar == NULL) ! goto failed; if (opt->jo_cwd != NULL) cwd_wchar = enc_to_utf16(opt->jo_cwd, NULL); win32_build_env(opt->jo_env, &ga_env, TRUE); env_wchar = ga_env.ga_data; *************** *** 3490,3495 **** --- 3499,3505 ---- winpty_spawn_config_free(spawn_config); vim_free(cmd_wchar); vim_free(cwd_wchar); + vim_free(env_wchar); create_vterm(term, term->tl_rows, term->tl_cols); *************** *** 3511,3519 **** return OK; failed: ! if (argvar->v_type == VAR_LIST) ! vim_free(ga_cmd.ga_data); ! vim_free(ga_env.ga_data); vim_free(cmd_wchar); vim_free(cwd_wchar); if (spawn_config != NULL) --- 3521,3528 ---- return OK; failed: ! ga_clear(&ga_cmd); ! ga_clear(&ga_env); vim_free(cmd_wchar); vim_free(cwd_wchar); if (spawn_config != NULL) *** ../vim-8.0.1428/src/testdir/test_terminal.vim 2017-12-05 12:29:57.454648456 +0100 --- src/testdir/test_terminal.vim 2018-01-26 19:34:31.473618633 +0100 *************** *** 795,797 **** --- 795,808 ---- au! repro delfunc Nop endfunc + + func Test_terminal_term_start_empty_command() + let cmd = "call term_start('', {'curwin' : 1, 'term_finish' : 'close'})" + call assert_fails(cmd, 'E474') + let cmd = "call term_start('', {'curwin' : 1, 'term_finish' : 'close'})" + call assert_fails(cmd, 'E474') + let cmd = "call term_start({}, {'curwin' : 1, 'term_finish' : 'close'})" + call assert_fails(cmd, 'E474') + let cmd = "call term_start(0, {'curwin' : 1, 'term_finish' : 'close'})" + call assert_fails(cmd, 'E474') + endfunc *** ../vim-8.0.1428/src/version.c 2018-01-02 15:37:42.370832263 +0100 --- src/version.c 2018-01-26 20:03:54.314237992 +0100 *************** *** 773,774 **** --- 773,776 ---- { /* Add new patch number below this line */ + /**/ + 1429, /**/ -- Married is a three ring circus: First comes the engagement ring. Then comes the wedding ring. Then comes the suffering. /// 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 ///