patch 9.0.1695: Crash with overlong textprop above

Commit: 
https://github.com/vim/vim/commit/f1cc4d55b9ed3335985512fb9fedf31cc4bb65a0
Author: Christian Brabandt <[email protected]>
Date:   Sat Aug 12 00:14:14 2023 +0200

    patch 9.0.1695: Crash with overlong textprop above
    
    Problem: Crash with overlong textprop above
    Solution: Consider only positive padding
    
    closes: #12665
    closes: #12661
    
    Signed-off-by: Christian Brabandt <[email protected]>

diff --git a/src/drawline.c b/src/drawline.c
index 0638c5682..9d6ee8d8d 100644
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -721,7 +721,7 @@ text_prop_position(
 
        // add 1 for NUL, 2 for when '…' is used
        if (n_attr != NULL)
-           l = alloc(n_used + before + after + padding + 3);
+           l = alloc(n_used + before + after + (padding > 0 ? padding : 0) + 
3);
        if (n_attr == NULL || l != NULL)
        {
            int off = 0;
@@ -801,7 +801,7 @@ text_prop_position(
 
                // n_attr_skip will not be decremented before draw_state is
                // WL_LINE
-               *n_attr_skip = before + padding;
+               *n_attr_skip = before + (padding > 0 ? padding : 0);
            }
        }
     }
diff --git a/src/testdir/dumps/Test_prop_long_above_1.dump 
b/src/testdir/dumps/Test_prop_long_above_1.dump
new file mode 100644
index 000000000..f8db396de
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_long_above_1.dump
@@ -0,0 +1,8 @@
+|t+0#ffffff16#ff404010|h|e| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| |j|u|m|p|s| 
|o|v|e|r| |t|h|e| |l|a|z|y| |d|o|g|.| |t|h|e| |q|u|i|c|k| |b|r|o|w|n
+>x+0#0000000#ffffff0@2| @56
+|y@2| @56
+|~+0#4040ff13&| @58
+|~| @58
+|~| @58
+|~| @58
+| +0#0000000&@41|1|,|1|-|6|1| @7|A|l@1| 
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index 550a0e5af..67547f00a 100644
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -3951,5 +3951,24 @@ func Test_error_after_using_negative_id()
   call StopVimInTerminal(buf)
 endfunc
 
+func Test_overlong_textprop_above_crash()
+  CheckRunVimInTerminal
+
+  let lines =<< trim END
+  vim9script
+  prop_type_add('PropType', {highlight: 'Error'})
+  setline(1, ['xxx ', 'yyy'])
+  prop_add(1, 0, {
+      type: 'PropType',
+      text: 'the quick brown fox jumps over the lazy dog. the quick brown fox 
jumps over the lazy dog. the quick brown fox jumps over the lazy dog.',
+      text_align: 'above',
+      text_wrap: 'wrap',
+  })
+  END
+  call writefile(lines, 'XtextPropLongAbove', 'D')
+  let buf = RunVimInTerminal('-S XtextPropLongAbove', #{rows: 8, cols: 60})
+  call VerifyScreenDump(buf, 'Test_prop_long_above_1', {})
 
+  call StopVimInTerminal(buf)
+endfunc
 " vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index b612dc78a..57830dd9b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1695,
 /**/
     1694,
 /**/

-- 
-- 
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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1qUadv-00FFdo-BX%40256bit.org.

Raspunde prin e-mail lui