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.
Files:      src/screen.c


*** ../vim-7.4.796/src/screen.c 2015-07-21 15:48:13.589517950 +0200
--- src/screen.c        2015-07-25 22:46:44.028355647 +0200
***************
*** 279,284 ****
--- 279,285 ----
      int               type;
  {
      int               rows;
+     int               cols = screen_Columns;
      int               r;
      int               ret = 0;
      schar_T   *screenline;    /* copy from ScreenLines[] */
***************
*** 291,318 ****
  #endif
  
      redraw_later(type);
!     if (msg_scrolled || (State != NORMAL && State != NORMAL_BUSY))
        return ret;
  
      /* Allocate space to save the text displayed in the command line area. */
!     rows = Rows - cmdline_row;
      screenline = (schar_T *)lalloc(
!                          (long_u)(rows * Columns * sizeof(schar_T)), FALSE);
      screenattr = (sattr_T *)lalloc(
!                          (long_u)(rows * Columns * 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);
        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);
            if (screenlineC[i] == NULL)
                ret = 2;
        }
--- 292,319 ----
  #endif
  
      redraw_later(type);
!     if (msg_scrolled || (State != NORMAL && State != NORMAL_BUSY) || exiting)
        return ret;
  
      /* Allocate space to save the text displayed in the command line area. */
!     rows = screen_Rows - cmdline_row;
      screenline = (schar_T *)lalloc(
!                          (long_u)(rows * cols * sizeof(schar_T)), FALSE);
      screenattr = (sattr_T *)lalloc(
!                          (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 * 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 * cols * sizeof(u8char_T)), FALSE);
            if (screenlineC[i] == NULL)
                ret = 2;
        }
***************
*** 320,326 ****
      if (enc_dbcs == DBCS_JPNU)
      {
        screenline2 = (schar_T *)lalloc(
!                          (long_u)(rows * Columns * sizeof(schar_T)), FALSE);
        if (screenline2 == NULL)
            ret = 2;
      }
--- 321,327 ----
      if (enc_dbcs == DBCS_JPNU)
      {
        screenline2 = (schar_T *)lalloc(
!                          (long_u)(rows * cols * sizeof(schar_T)), FALSE);
        if (screenline2 == NULL)
            ret = 2;
      }
***************
*** 331,357 ****
        /* Save the text displayed in the command line area. */
        for (r = 0; r < rows; ++r)
        {
!           mch_memmove(screenline + r * Columns,
                        ScreenLines + LineOffset[cmdline_row + r],
!                       (size_t)Columns * sizeof(schar_T));
!           mch_memmove(screenattr + r * Columns,
                        ScreenAttrs + LineOffset[cmdline_row + r],
!                       (size_t)Columns * sizeof(sattr_T));
  #ifdef FEAT_MBYTE
            if (enc_utf8)
            {
!               mch_memmove(screenlineUC + r * Columns,
                            ScreenLinesUC + LineOffset[cmdline_row + r],
!                           (size_t)Columns * 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));
            }
            if (enc_dbcs == DBCS_JPNU)
!               mch_memmove(screenline2 + r * Columns,
                            ScreenLines2 + LineOffset[cmdline_row + r],
!                           (size_t)Columns * sizeof(schar_T));
  #endif
        }
  
--- 332,358 ----
        /* Save the text displayed in the command line area. */
        for (r = 0; r < rows; ++r)
        {
!           mch_memmove(screenline + r * cols,
                        ScreenLines + LineOffset[cmdline_row + r],
!                       (size_t)cols * sizeof(schar_T));
!           mch_memmove(screenattr + r * cols,
                        ScreenAttrs + LineOffset[cmdline_row + r],
!                       (size_t)cols * sizeof(sattr_T));
  #ifdef FEAT_MBYTE
            if (enc_utf8)
            {
!               mch_memmove(screenlineUC + r * cols,
                            ScreenLinesUC + LineOffset[cmdline_row + r],
!                           (size_t)cols * sizeof(u8char_T));
                for (i = 0; i < p_mco; ++i)
!                   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 * cols,
                            ScreenLines2 + LineOffset[cmdline_row + r],
!                           (size_t)cols * sizeof(schar_T));
  #endif
        }
  
***************
*** 366,393 ****
            for (r = 0; r < rows; ++r)
            {
                mch_memmove(current_ScreenLine,
!                           screenline + r * Columns,
!                           (size_t)Columns * sizeof(schar_T));
                mch_memmove(ScreenAttrs + off,
!                           screenattr + r * Columns,
!                           (size_t)Columns * sizeof(sattr_T));
  #ifdef FEAT_MBYTE
                if (enc_utf8)
                {
                    mch_memmove(ScreenLinesUC + off,
!                               screenlineUC + r * Columns,
!                               (size_t)Columns * 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));
                }
                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);
            }
            ret = 4;
        }
--- 367,394 ----
            for (r = 0; r < rows; ++r)
            {
                mch_memmove(current_ScreenLine,
!                           screenline + r * cols,
!                           (size_t)cols * sizeof(schar_T));
                mch_memmove(ScreenAttrs + off,
!                           screenattr + r * cols,
!                           (size_t)cols * sizeof(sattr_T));
  #ifdef FEAT_MBYTE
                if (enc_utf8)
                {
                    mch_memmove(ScreenLinesUC + off,
!                               screenlineUC + r * cols,
!                               (size_t)cols * sizeof(u8char_T));
                    for (i = 0; i < p_mco; ++i)
                        mch_memmove(ScreenLinesC[i] + off,
!                                   screenlineC[i] + r * cols,
!                                   (size_t)cols * sizeof(u8char_T));
                }
                if (enc_dbcs == DBCS_JPNU)
                    mch_memmove(ScreenLines2 + off,
!                               screenline2 + r * cols,
!                               (size_t)cols * sizeof(schar_T));
  #endif
!               SCREEN_LINE(cmdline_row + r, 0, cols, cols, FALSE);
            }
            ret = 4;
        }
*** ../vim-7.4.796/src/version.c        2015-07-22 22:46:08.127010101 +0200
--- src/version.c       2015-07-25 22:38:04.193354077 +0200
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     797,
  /**/

-- 
Women are probably the main cause of free software starvation.

 /// Bram Moolenaar -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui