Patch 8.2.4863
Problem:    Accessing freed memory in test without the +channel feature.
            (Dominique Pellé)
Solution:   Do not generted PUSHCHANNEL or PUSHJOB if they are not
            implemented. (closes #10350)
Files:      src/vim9instr.c, src/errors.h, src/vim9compile.c,
            src/testdir/test_vim9_script.vim


*** ../vim-8.2.4862/src/vim9instr.c     2022-04-27 17:54:20.147363240 +0100
--- src/vim9instr.c     2022-05-04 16:38:34.321675911 +0100
***************
*** 755,766 ****
--- 755,773 ----
      int
  generate_PUSHCHANNEL(cctx_T *cctx)
  {
+ #ifdef FEAT_JOB_CHANNEL
      isn_T     *isn;
+ #endif
  
      RETURN_OK_IF_SKIP(cctx);
+ #ifdef FEAT_JOB_CHANNEL
      if ((isn = generate_instr_type(cctx, ISN_PUSHCHANNEL, &t_channel)) == 
NULL)
        return FAIL;
      return OK;
+ #else
+     emsg(_(e_channel_job_feature_not_available));
+     return FAIL;
+ #endif
  }
  
  /*
***************
*** 769,780 ****
--- 776,794 ----
      int
  generate_PUSHJOB(cctx_T *cctx)
  {
+ #ifdef FEAT_JOB_CHANNEL
      isn_T     *isn;
+ #endif
  
      RETURN_OK_IF_SKIP(cctx);
+ #ifdef FEAT_JOB_CHANNEL
      if ((isn = generate_instr_type(cctx, ISN_PUSHJOB, &t_job)) == NULL)
        return FAIL;
      return OK;
+ #else
+     emsg(_(e_channel_job_feature_not_available));
+     return FAIL;
+ #endif
  }
  
  /*
*** ../vim-8.2.4862/src/errors.h        2022-05-04 15:40:16.032317666 +0100
--- src/errors.h        2022-05-04 16:34:11.749873513 +0100
***************
*** 3264,3267 ****
--- 3264,3271 ----
        INIT(= N_("E1275: String or function required for ->(expr)"));
  EXTERN char e_illegal_map_mode_string_str[]
        INIT(= N_("E1276: Illegal map mode string: '%s'"));
+ # if !defined(FEAT_JOB_CHANNEL)
+ EXTERN char e_channel_job_feature_not_available[]
+       INIT(= N_("E1277: Channel and job feature is not available"));
+ # endif
  #endif
*** ../vim-8.2.4862/src/vim9compile.c   2022-04-25 12:43:15.175819215 +0100
--- src/vim9compile.c   2022-05-04 16:42:36.053500087 +0100
***************
*** 2293,2331 ****
            }
            else
            {
                // variables are always initialized
                if (GA_GROW_FAILS(instr, 1))
                    goto theend;
                switch (lhs.lhs_member_type->tt_type)
                {
                    case VAR_BOOL:
!                       generate_PUSHBOOL(cctx, VVAL_FALSE);
                        break;
                    case VAR_FLOAT:
  #ifdef FEAT_FLOAT
!                       generate_PUSHF(cctx, 0.0);
  #endif
                        break;
                    case VAR_STRING:
!                       generate_PUSHS(cctx, NULL);
                        break;
                    case VAR_BLOB:
!                       generate_PUSHBLOB(cctx, blob_alloc());
                        break;
                    case VAR_FUNC:
!                       generate_PUSHFUNC(cctx, NULL, &t_func_void);
                        break;
                    case VAR_LIST:
!                       generate_NEWLIST(cctx, 0, FALSE);
                        break;
                    case VAR_DICT:
!                       generate_NEWDICT(cctx, 0, FALSE);
                        break;
                    case VAR_JOB:
!                       generate_PUSHJOB(cctx);
                        break;
                    case VAR_CHANNEL:
!                       generate_PUSHCHANNEL(cctx);
                        break;
                    case VAR_NUMBER:
                    case VAR_UNKNOWN:
--- 2293,2333 ----
            }
            else
            {
+               int r = OK;
+ 
                // variables are always initialized
                if (GA_GROW_FAILS(instr, 1))
                    goto theend;
                switch (lhs.lhs_member_type->tt_type)
                {
                    case VAR_BOOL:
!                       r = generate_PUSHBOOL(cctx, VVAL_FALSE);
                        break;
                    case VAR_FLOAT:
  #ifdef FEAT_FLOAT
!                       r = generate_PUSHF(cctx, 0.0);
  #endif
                        break;
                    case VAR_STRING:
!                       r = generate_PUSHS(cctx, NULL);
                        break;
                    case VAR_BLOB:
!                       r = generate_PUSHBLOB(cctx, blob_alloc());
                        break;
                    case VAR_FUNC:
!                       r = generate_PUSHFUNC(cctx, NULL, &t_func_void);
                        break;
                    case VAR_LIST:
!                       r = generate_NEWLIST(cctx, 0, FALSE);
                        break;
                    case VAR_DICT:
!                       r = generate_NEWDICT(cctx, 0, FALSE);
                        break;
                    case VAR_JOB:
!                       r = generate_PUSHJOB(cctx);
                        break;
                    case VAR_CHANNEL:
!                       r = generate_PUSHCHANNEL(cctx);
                        break;
                    case VAR_NUMBER:
                    case VAR_UNKNOWN:
***************
*** 2343,2352 ****
                        else
                        {
                            instr_count = instr->ga_len;
!                           generate_PUSHNR(cctx, 0);
                        }
                        break;
                }
            }
            if (var_count == 0)
                end = p;
--- 2345,2356 ----
                        else
                        {
                            instr_count = instr->ga_len;
!                           r = generate_PUSHNR(cctx, 0);
                        }
                        break;
                }
+               if (r == FAIL)
+                   goto theend;
            }
            if (var_count == 0)
                end = p;
*** ../vim-8.2.4862/src/testdir/test_vim9_script.vim    2022-05-04 
16:24:54.182341138 +0100
--- src/testdir/test_vim9_script.vim    2022-05-04 16:45:15.425386277 +0100
***************
*** 4132,4139 ****
    var Var_func: func
    var var_string: string
    var var_blob: blob
!   var var_job: job
!   var var_channel: channel
    var var_list: list<any>
    var var_dict: dict<any>
  
--- 4132,4141 ----
    var Var_func: func
    var var_string: string
    var var_blob: blob
!   if has('job')
!     var var_job: job
!     var var_channel: channel
!   endif
    var var_list: list<any>
    var var_dict: dict<any>
  
***************
*** 4144,4151 ****
    echo Var_func
    echo var_string
    echo var_blob
!   echo var_job
!   echo var_channel
    echo var_list
    echo var_dict
    redir END
--- 4146,4158 ----
    echo Var_func
    echo var_string
    echo var_blob
!   if has('job')
!     echo var_job
!     echo var_channel
!   else
!     echo 'no process'
!     echo 'channel fail'
!   endif
    echo var_list
    echo var_dict
    redir END
*** ../vim-8.2.4862/src/version.c       2022-05-04 16:24:54.182341138 +0100
--- src/version.c       2022-05-04 16:29:49.002082547 +0100
***************
*** 748,749 ****
--- 748,751 ----
  {   /* Add new patch number below this line */
+ /**/
+     4863,
  /**/

-- 
>From "know your smileys":
 :-E    Has major dental problems

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220504154720.0C6351C19BB%40moolenaar.net.

Raspunde prin e-mail lui