Mercurial > vim
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; |