Skip to content

Commit

Permalink
patch 9.0.0259: crash with mouse click when not initialized
Browse files Browse the repository at this point in the history
Problem:    Crash with mouse click when not initialized.
Solution:   Check TabPageIdxs[] is not NULL.
  • Loading branch information
brammool committed Aug 24, 2022
1 parent fd99945 commit 8052575
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 52 deletions.
107 changes: 55 additions & 52 deletions src/mouse.c
Expand Up @@ -471,74 +471,77 @@ do_mouse(

start_visual.lnum = 0;

// Check for clicking in the tab page line.
if (mouse_row == 0 && firstwin->w_winrow > 0)
if (TabPageIdxs != NULL) // only when initialized
{
if (is_drag)
// Check for clicking in the tab page line.
if (mouse_row == 0 && firstwin->w_winrow > 0)
{
if (in_tab_line)
if (is_drag)
{
c1 = TabPageIdxs[mouse_col];
tabpage_move(c1 <= 0 ? 9999 : c1 < tabpage_index(curtab)
? c1 - 1 : c1);
if (in_tab_line)
{
c1 = TabPageIdxs[mouse_col];
tabpage_move(c1 <= 0 ? 9999 : c1 < tabpage_index(curtab)
? c1 - 1 : c1);
}
return FALSE;
}
return FALSE;
}

// click in a tab selects that tab page
if (is_click
// click in a tab selects that tab page
if (is_click
# ifdef FEAT_CMDWIN
&& cmdwin_type == 0
&& cmdwin_type == 0
# endif
&& mouse_col < Columns)
{
in_tab_line = TRUE;
c1 = TabPageIdxs[mouse_col];
if (c1 >= 0)
&& mouse_col < Columns)
{
if ((mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK)
{
// double click opens new page
end_visual_mode_keep_button();
tabpage_new();
tabpage_move(c1 == 0 ? 9999 : c1 - 1);
}
else
in_tab_line = TRUE;
c1 = TabPageIdxs[mouse_col];
if (c1 >= 0)
{
// Go to specified tab page, or next one if not clicking
// on a label.
goto_tabpage(c1);

// It's like clicking on the status line of a window.
if (curwin != old_curwin)
if ((mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK)
{
// double click opens new page
end_visual_mode_keep_button();
}
}
else
{
tabpage_T *tp;
tabpage_new();
tabpage_move(c1 == 0 ? 9999 : c1 - 1);
}
else
{
// Go to specified tab page, or next one if not clicking
// on a label.
goto_tabpage(c1);

// Close the current or specified tab page.
if (c1 == -999)
tp = curtab;
// It's like clicking on the status line of a window.
if (curwin != old_curwin)
end_visual_mode_keep_button();
}
}
else
tp = find_tabpage(-c1);
if (tp == curtab)
{
if (first_tabpage->tp_next != NULL)
tabpage_close(FALSE);
tabpage_T *tp;

// Close the current or specified tab page.
if (c1 == -999)
tp = curtab;
else
tp = find_tabpage(-c1);
if (tp == curtab)
{
if (first_tabpage->tp_next != NULL)
tabpage_close(FALSE);
}
else if (tp != NULL)
tabpage_close_other(tp, FALSE);
}
else if (tp != NULL)
tabpage_close_other(tp, FALSE);
}
return TRUE;
}
else if (is_drag && in_tab_line)
{
c1 = TabPageIdxs[mouse_col];
tabpage_move(c1 <= 0 ? 9999 : c1 - 1);
return FALSE;
}
return TRUE;
}
else if (is_drag && in_tab_line)
{
c1 = TabPageIdxs[mouse_col];
tabpage_move(c1 <= 0 ? 9999 : c1 - 1);
return FALSE;
}

// When 'mousemodel' is "popup" or "popup_setpos", translate mouse events:
Expand Down
14 changes: 14 additions & 0 deletions src/testdir/test_tabline.vim
Expand Up @@ -147,4 +147,18 @@ func Test_tabline_20_format_items_no_overrun()
set showtabline& tabline&
endfunc

func Test_mouse_click_in_tab()
" This used to crash because TabPageIdxs[] was not initialized
let lines =<< trim END
tabnew
set mouse=a
exe "norm \<LeftMouse>"
END
call writefile(lines, 'Xclickscript')
call RunVim([], [], "-e -s -S Xclickscript -c qa")

call delete('Xclickscript')
endfunc


" vim: shiftwidth=2 sts=2 expandtab
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -731,6 +731,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
259,
/**/
258,
/**/
Expand Down

0 comments on commit 8052575

Please sign in to comment.