# HG changeset patch # User Bram Moolenaar # Date 1437857580 -7200 # Node ID 87cb71d54e8ae31700862bea78ceb89b50741161 # Parent 8840c1ae3b50f3094a0b5d170bb19acc5690da00 patch 7.4.797 Problem: Crash when using more lines for the command line than 'maxcombine'. Solution: Use the correct array index. Also, do not try redrawing when exiting. And use screen_Columns instead of Columns. diff --git a/src/screen.c b/src/screen.c --- a/src/screen.c +++ b/src/screen.c @@ -279,6 +279,7 @@ redraw_asap(type) int type; { int rows; + int cols = screen_Columns; int r; int ret = 0; schar_T *screenline; /* copy from ScreenLines[] */ @@ -291,28 +292,28 @@ redraw_asap(type) #endif redraw_later(type); - if (msg_scrolled || (State != NORMAL && State != NORMAL_BUSY)) + if (msg_scrolled || (State != NORMAL && State != NORMAL_BUSY) || exiting) return ret; /* Allocate space to save the text displayed in the command line area. */ - rows = Rows - cmdline_row; + rows = screen_Rows - cmdline_row; screenline = (schar_T *)lalloc( - (long_u)(rows * Columns * sizeof(schar_T)), FALSE); + (long_u)(rows * cols * sizeof(schar_T)), FALSE); screenattr = (sattr_T *)lalloc( - (long_u)(rows * Columns * sizeof(sattr_T)), FALSE); + (long_u)(rows * cols * sizeof(sattr_T)), FALSE); if (screenline == NULL || screenattr == NULL) ret = 2; #ifdef FEAT_MBYTE if (enc_utf8) { screenlineUC = (u8char_T *)lalloc( - (long_u)(rows * Columns * sizeof(u8char_T)), FALSE); + (long_u)(rows * cols * sizeof(u8char_T)), FALSE); if (screenlineUC == NULL) ret = 2; for (i = 0; i < p_mco; ++i) { screenlineC[i] = (u8char_T *)lalloc( - (long_u)(rows * Columns * sizeof(u8char_T)), FALSE); + (long_u)(rows * cols * sizeof(u8char_T)), FALSE); if (screenlineC[i] == NULL) ret = 2; } @@ -320,7 +321,7 @@ redraw_asap(type) if (enc_dbcs == DBCS_JPNU) { screenline2 = (schar_T *)lalloc( - (long_u)(rows * Columns * sizeof(schar_T)), FALSE); + (long_u)(rows * cols * sizeof(schar_T)), FALSE); if (screenline2 == NULL) ret = 2; } @@ -331,27 +332,27 @@ redraw_asap(type) /* Save the text displayed in the command line area. */ for (r = 0; r < rows; ++r) { - mch_memmove(screenline + r * Columns, + mch_memmove(screenline + r * cols, ScreenLines + LineOffset[cmdline_row + r], - (size_t)Columns * sizeof(schar_T)); - mch_memmove(screenattr + r * Columns, + (size_t)cols * sizeof(schar_T)); + mch_memmove(screenattr + r * cols, ScreenAttrs + LineOffset[cmdline_row + r], - (size_t)Columns * sizeof(sattr_T)); + (size_t)cols * sizeof(sattr_T)); #ifdef FEAT_MBYTE if (enc_utf8) { - mch_memmove(screenlineUC + r * Columns, + mch_memmove(screenlineUC + r * cols, ScreenLinesUC + LineOffset[cmdline_row + r], - (size_t)Columns * sizeof(u8char_T)); + (size_t)cols * sizeof(u8char_T)); for (i = 0; i < p_mco; ++i) - mch_memmove(screenlineC[i] + r * Columns, - ScreenLinesC[r] + LineOffset[cmdline_row + r], - (size_t)Columns * sizeof(u8char_T)); + mch_memmove(screenlineC[i] + r * cols, + ScreenLinesC[i] + LineOffset[cmdline_row + r], + (size_t)cols * sizeof(u8char_T)); } if (enc_dbcs == DBCS_JPNU) - mch_memmove(screenline2 + r * Columns, + mch_memmove(screenline2 + r * cols, ScreenLines2 + LineOffset[cmdline_row + r], - (size_t)Columns * sizeof(schar_T)); + (size_t)cols * sizeof(schar_T)); #endif } @@ -366,28 +367,28 @@ redraw_asap(type) for (r = 0; r < rows; ++r) { mch_memmove(current_ScreenLine, - screenline + r * Columns, - (size_t)Columns * sizeof(schar_T)); + screenline + r * cols, + (size_t)cols * sizeof(schar_T)); mch_memmove(ScreenAttrs + off, - screenattr + r * Columns, - (size_t)Columns * sizeof(sattr_T)); + screenattr + r * cols, + (size_t)cols * sizeof(sattr_T)); #ifdef FEAT_MBYTE if (enc_utf8) { mch_memmove(ScreenLinesUC + off, - screenlineUC + r * Columns, - (size_t)Columns * sizeof(u8char_T)); + screenlineUC + r * cols, + (size_t)cols * sizeof(u8char_T)); for (i = 0; i < p_mco; ++i) mch_memmove(ScreenLinesC[i] + off, - screenlineC[i] + r * Columns, - (size_t)Columns * sizeof(u8char_T)); + screenlineC[i] + r * cols, + (size_t)cols * sizeof(u8char_T)); } if (enc_dbcs == DBCS_JPNU) mch_memmove(ScreenLines2 + off, - screenline2 + r * Columns, - (size_t)Columns * sizeof(schar_T)); -#endif - SCREEN_LINE(cmdline_row + r, 0, Columns, Columns, FALSE); + screenline2 + r * cols, + (size_t)cols * sizeof(schar_T)); +#endif + SCREEN_LINE(cmdline_row + r, 0, cols, cols, FALSE); } ret = 4; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 797, +/**/ 796, /**/ 795,