comparison src/terminal.c @ 15249:544490b69e1d v8.1.0633

patch 8.1.0633: crash when out of memory while opening a terminal window commit https://github.com/vim/vim/commit/cd929f7ba8cc5b6d6dcf35c8b34124e969fed6b8 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Dec 24 21:38:45 2018 +0100 patch 8.1.0633: crash when out of memory while opening a terminal window Problem: Crash when out of memory while opening a terminal window. Solution: Handle out-of-memory more gracefully.
author Bram Moolenaar <Bram@vim.org>
date Mon, 24 Dec 2018 21:45:05 +0100
parents 49bc670c3ee9
children 19272aa12962
comparison
equal deleted inserted replaced
15248:1e57afb3e8e9 15249:544490b69e1d
3428 static void 3428 static void
3429 set_vterm_palette(VTerm *vterm, long_u *rgb) 3429 set_vterm_palette(VTerm *vterm, long_u *rgb)
3430 { 3430 {
3431 int index = 0; 3431 int index = 0;
3432 VTermState *state = vterm_obtain_state(vterm); 3432 VTermState *state = vterm_obtain_state(vterm);
3433
3433 for (; index < 16; index++) 3434 for (; index < 16; index++)
3434 { 3435 {
3435 VTermColor color; 3436 VTermColor color;
3436 color.red = (unsigned)(rgb[index] >> 16); 3437 color.red = (unsigned)(rgb[index] >> 16);
3437 color.green = (unsigned)(rgb[index] >> 8) & 255; 3438 color.green = (unsigned)(rgb[index] >> 8) & 255;
3701 &vterm_memfree 3702 &vterm_memfree
3702 }; 3703 };
3703 3704
3704 /* 3705 /*
3705 * Create a new vterm and initialize it. 3706 * Create a new vterm and initialize it.
3706 */ 3707 * Return FAIL when out of memory.
3707 static void 3708 */
3709 static int
3708 create_vterm(term_T *term, int rows, int cols) 3710 create_vterm(term_T *term, int rows, int cols)
3709 { 3711 {
3710 VTerm *vterm; 3712 VTerm *vterm;
3711 VTermScreen *screen; 3713 VTermScreen *screen;
3712 VTermState *state; 3714 VTermState *state;
3713 VTermValue value; 3715 VTermValue value;
3714 3716
3715 vterm = vterm_new_with_allocator(rows, cols, &vterm_allocator, NULL); 3717 vterm = vterm_new_with_allocator(rows, cols, &vterm_allocator, NULL);
3716 term->tl_vterm = vterm; 3718 term->tl_vterm = vterm;
3719 if (vterm == NULL)
3720 return FAIL;
3721
3722 // Allocate screen and state here, so we can bail out if that fails.
3723 state = vterm_obtain_state(vterm);
3717 screen = vterm_obtain_screen(vterm); 3724 screen = vterm_obtain_screen(vterm);
3725 if (state == NULL || screen == NULL)
3726 {
3727 vterm_free(vterm);
3728 return FAIL;
3729 }
3730
3718 vterm_screen_set_callbacks(screen, &screen_callbacks, term); 3731 vterm_screen_set_callbacks(screen, &screen_callbacks, term);
3719 /* TODO: depends on 'encoding'. */ 3732 /* TODO: depends on 'encoding'. */
3720 vterm_set_utf8(vterm, 1); 3733 vterm_set_utf8(vterm, 1);
3721 3734
3722 init_default_colors(term); 3735 init_default_colors(term);
3723 3736
3724 vterm_state_set_default_colors( 3737 vterm_state_set_default_colors(
3725 vterm_obtain_state(vterm), 3738 state,
3726 &term->tl_default_color.fg, 3739 &term->tl_default_color.fg,
3727 &term->tl_default_color.bg); 3740 &term->tl_default_color.bg);
3728 3741
3729 if (t_colors >= 16) 3742 if (t_colors >= 16)
3730 vterm_state_set_bold_highbright(vterm_obtain_state(vterm), 1); 3743 vterm_state_set_bold_highbright(vterm_obtain_state(vterm), 1);
3744 else 3757 else
3745 value.boolean = 1; 3758 value.boolean = 1;
3746 #else 3759 #else
3747 value.boolean = 0; 3760 value.boolean = 0;
3748 #endif 3761 #endif
3749 state = vterm_obtain_state(vterm);
3750 vterm_state_set_termprop(state, VTERM_PROP_CURSORBLINK, &value); 3762 vterm_state_set_termprop(state, VTERM_PROP_CURSORBLINK, &value);
3751 vterm_state_set_unrecognised_fallbacks(state, &parser_fallbacks, term); 3763 vterm_state_set_unrecognised_fallbacks(state, &parser_fallbacks, term);
3764
3765 return OK;
3752 } 3766 }
3753 3767
3754 /* 3768 /*
3755 * Return the text to show for the buffer name and status. 3769 * Return the text to show for the buffer name and status.
3756 */ 3770 */
5627 winpty_spawn_config_free(spawn_config); 5641 winpty_spawn_config_free(spawn_config);
5628 vim_free(cmd_wchar); 5642 vim_free(cmd_wchar);
5629 vim_free(cwd_wchar); 5643 vim_free(cwd_wchar);
5630 vim_free(env_wchar); 5644 vim_free(env_wchar);
5631 5645
5632 create_vterm(term, term->tl_rows, term->tl_cols); 5646 if (create_vterm(term, term->tl_rows, term->tl_cols) == FAIL)
5647 goto failed;
5633 5648
5634 #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 5649 #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
5635 if (opt->jo_set2 & JO2_ANSI_COLORS) 5650 if (opt->jo_set2 & JO2_ANSI_COLORS)
5636 set_vterm_palette(term->tl_vterm, opt->jo_ansi_colors); 5651 set_vterm_palette(term->tl_vterm, opt->jo_ansi_colors);
5637 else 5652 else
5708 HANDLE hPipeIn = INVALID_HANDLE_VALUE; 5723 HANDLE hPipeIn = INVALID_HANDLE_VALUE;
5709 HANDLE hPipeOut = INVALID_HANDLE_VALUE; 5724 HANDLE hPipeOut = INVALID_HANDLE_VALUE;
5710 char in_name[80], out_name[80]; 5725 char in_name[80], out_name[80];
5711 channel_T *channel = NULL; 5726 channel_T *channel = NULL;
5712 5727
5713 create_vterm(term, term->tl_rows, term->tl_cols); 5728 if (create_vterm(term, term->tl_rows, term->tl_cols) == FAIL)
5729 return FAIL;
5714 5730
5715 vim_snprintf(in_name, sizeof(in_name), "\\\\.\\pipe\\vim-%d-in-%d", 5731 vim_snprintf(in_name, sizeof(in_name), "\\\\.\\pipe\\vim-%d-in-%d",
5716 GetCurrentProcessId(), 5732 GetCurrentProcessId(),
5717 curbuf->b_fnum); 5733 curbuf->b_fnum);
5718 hPipeIn = CreateNamedPipe(in_name, PIPE_ACCESS_OUTBOUND, 5734 hPipeIn = CreateNamedPipe(in_name, PIPE_ACCESS_OUTBOUND,
5820 typval_T *argvar, 5836 typval_T *argvar,
5821 char **argv, 5837 char **argv,
5822 jobopt_T *opt, 5838 jobopt_T *opt,
5823 jobopt_T *orig_opt UNUSED) 5839 jobopt_T *orig_opt UNUSED)
5824 { 5840 {
5825 create_vterm(term, term->tl_rows, term->tl_cols); 5841 if (create_vterm(term, term->tl_rows, term->tl_cols) == FAIL)
5842 return FAIL;
5826 5843
5827 #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 5844 #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
5828 if (opt->jo_set2 & JO2_ANSI_COLORS) 5845 if (opt->jo_set2 & JO2_ANSI_COLORS)
5829 set_vterm_palette(term->tl_vterm, opt->jo_ansi_colors); 5846 set_vterm_palette(term->tl_vterm, opt->jo_ansi_colors);
5830 else 5847 else
5842 } 5859 }
5843 5860
5844 static int 5861 static int
5845 create_pty_only(term_T *term, jobopt_T *opt) 5862 create_pty_only(term_T *term, jobopt_T *opt)
5846 { 5863 {
5847 create_vterm(term, term->tl_rows, term->tl_cols); 5864 if (create_vterm(term, term->tl_rows, term->tl_cols) == FAIL)
5865 return FAIL;
5848 5866
5849 term->tl_job = job_alloc(); 5867 term->tl_job = job_alloc();
5850 if (term->tl_job == NULL) 5868 if (term->tl_job == NULL)
5851 return FAIL; 5869 return FAIL;
5852 ++term->tl_job->jv_refcount; 5870 ++term->tl_job->jv_refcount;