patch 9.1.0069: ScreenLines may not be correctly initialized, causing hang

Commit: 
https://github.com/vim/vim/commit/fd472655a93fd539c731c8daf3adc4e65ddce341
Author: Olaf Seibert <rhia...@falu.nl>
Date:   Thu Feb 1 21:11:16 2024 +0100

    patch 9.1.0069: ScreenLines may not be correctly initialized, causing hang
    
    Problem:  ScreenLines may not be correctly initialized, causing hang
              (Olaf Seibert, after 9.0.0220)
    Solution: always initialize ScreneLines when allocating a screen
              (Olaf Seibert)
    
    ScreenLines and related structures could be left uninitialized
    causing a screen update to run into an infinite loop when using latin1
    encoding.
    
    Partly caused because by patch 9.0.0220, which makes mb_ptr2len return
    zero for NUL
    
    related: #12671
    closes: #13946
    
    Signed-off-by: Olaf Seibert <rhia...@falu.nl>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/screen.c b/src/screen.c
index 032e447a9..939a33599 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -2569,6 +2569,25 @@ give_up:
            new_LineOffset[new_row] = new_row * Columns;
            new_LineWraps[new_row] = FALSE;
 
+           (void)vim_memset(new_ScreenLines + new_row * Columns,
+                                 ' ', (size_t)Columns * sizeof(schar_T));
+           if (enc_utf8)
+           {
+               (void)vim_memset(new_ScreenLinesUC + new_row * Columns,
+                                  0, (size_t)Columns * sizeof(u8char_T));
+               for (int i = 0; i < p_mco; ++i)
+                   (void)vim_memset(new_ScreenLinesC[i]
+                                                     + new_row * Columns,
+                                  0, (size_t)Columns * sizeof(u8char_T));
+           }
+           if (enc_dbcs == DBCS_JPNU)
+               (void)vim_memset(new_ScreenLines2 + new_row * Columns,
+                                  0, (size_t)Columns * sizeof(schar_T));
+           (void)vim_memset(new_ScreenAttrs + new_row * Columns,
+                                   0, (size_t)Columns * sizeof(sattr_T));
+           (void)vim_memset(new_ScreenCols + new_row * Columns,
+                                   0, (size_t)Columns * sizeof(colnr_T));
+
            /*
             * If the screen is not going to be cleared, copy as much as
             * possible from the old screen to the new one and clear the rest
@@ -2577,24 +2596,6 @@ give_up:
             */
            if (!doclear)
            {
-               (void)vim_memset(new_ScreenLines + new_row * Columns,
-                                     ' ', (size_t)Columns * sizeof(schar_T));
-               if (enc_utf8)
-               {
-                   (void)vim_memset(new_ScreenLinesUC + new_row * Columns,
-                                      0, (size_t)Columns * sizeof(u8char_T));
-                   for (int i = 0; i < p_mco; ++i)
-                       (void)vim_memset(new_ScreenLinesC[i]
-                                                         + new_row * Columns,
-                                      0, (size_t)Columns * sizeof(u8char_T));
-               }
-               if (enc_dbcs == DBCS_JPNU)
-                   (void)vim_memset(new_ScreenLines2 + new_row * Columns,
-                                      0, (size_t)Columns * sizeof(schar_T));
-               (void)vim_memset(new_ScreenAttrs + new_row * Columns,
-                                       0, (size_t)Columns * sizeof(sattr_T));
-               (void)vim_memset(new_ScreenCols + new_row * Columns,
-                                       0, (size_t)Columns * sizeof(colnr_T));
                old_row = new_row + (screen_Rows - Rows);
                if (old_row >= 0 && ScreenLines != NULL)
                {
diff --git a/src/version.c b/src/version.c
index ce3c4fde2..b70c90a26 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    69,
 /**/
     68,
 /**/

-- 
-- 
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 vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1rVdhC-00806p-Ns%40256bit.org.

Reply via email to