patch 9.1.1415: potential use-after free when there is an error in 'tabpanel'

Commit: 
https://github.com/vim/vim/commit/ac83b3c373985080eda3a07a76a556b168da4abe
Author: Christian Brabandt <c...@256bit.org>
Date:   Tue May 27 20:49:34 2025 +0200

    patch 9.1.1415: potential use-after free when there is an error in 
'tabpanel'
    
    Problem:  potential use-after free when there is an error in 'tabpanel'
              option (@char101, after v9.1.1391)
    Solution: check if p_tpl has been set to null before accessing it again.
    
    While at it slightly change starts_with_percent_and_bang() and use the
    existing opt_name and opt_scope variables.
    
    fixes: #17364
    closes: #17388
    
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/tabpanel.c b/src/tabpanel.c
index bb7a8742b..599e434cb 100644
--- a/src/tabpanel.c
+++ b/src/tabpanel.c
@@ -530,8 +530,8 @@ starts_with_percent_and_bang(tabpanel_T *pargs)
        if (did_emsg > did_emsg_before)
        {
            usefmt = NULL;
-           set_string_option_direct((char_u *)"tabpanel", -1, (char_u *)"",
-                   OPT_FREE | OPT_GLOBAL, SID_ERROR);
+           set_string_option_direct(opt_name, -1, (char_u *)"",
+                   OPT_FREE | opt_scope, SID_ERROR);
        }
     }
 #endif
@@ -641,6 +641,12 @@ do_by_tplmode(
                args.prow = &row;
                args.pcol = &col;
                draw_tabpanel_userdefined(tplmode, &args);
+               // p_tpl could have been freed in build_stl_str_hl()
+               if (p_tpl == NULL || *p_tpl == NUL)
+               {
+                   usefmt = NULL;
+                   break;
+               }
 
                p += i;
                i = 0;
diff --git a/src/testdir/test_tabpanel.vim b/src/testdir/test_tabpanel.vim
index 46ebe3b62..e0a6a8c61 100644
--- a/src/testdir/test_tabpanel.vim
+++ b/src/testdir/test_tabpanel.vim
@@ -529,6 +529,14 @@ function Test_tabpanel_error()
   catch /^Vim\%(( \+)\)\=:E117:/
   endtry
   call assert_true(empty(&tabpanel))
+
+  try
+    set tabpanel=%{my#util#TabPanelHighlight}%t
+    redraw!
+  catch /^Vim\%(( \+)\)\=:E121:/
+  endtry
+  call assert_true(empty(&tabpanel))
+
   set tabpanel&vim
   set showtabpanel&vim
 endfunc
diff --git a/src/version.c b/src/version.c
index 5366f3f2e..a788db1af 100644
--- a/src/version.c
+++ b/src/version.c
@@ -709,6 +709,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1415,
 /**/
     1414,
 /**/

-- 
-- 
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 visit 
https://groups.google.com/d/msgid/vim_dev/E1uJzWz-001ZwR-29%40256bit.org.

Raspunde prin e-mail lui