@@ -5021,11 +5021,11 @@ job_free_contents(job_T *job)
50215021 vim_free (job -> jv_tty_out );
50225022 vim_free (job -> jv_stoponexit );
50235023 free_callback (job -> jv_exit_cb , job -> jv_exit_partial );
5024- if (job -> argv != NULL )
5024+ if (job -> jv_argv != NULL )
50255025 {
5026- for (i = 0 ; job -> argv [i ] != NULL ; i ++ )
5027- vim_free (job -> argv [i ]);
5028- vim_free (job -> argv );
5026+ for (i = 0 ; job -> jv_argv [i ] != NULL ; i ++ )
5027+ vim_free (job -> jv_argv [i ]);
5028+ vim_free (job -> jv_argv );
50295029 }
50305030}
50315031
@@ -5462,16 +5462,15 @@ job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg)
54625462{
54635463 job_T * job ;
54645464 char_u * cmd = NULL ;
5465- #if defined(UNIX )
5466- # define USE_ARGV
54675465 char * * argv = NULL ;
54685466 int argc = 0 ;
5467+ #if defined(UNIX )
5468+ # define USE_ARGV
54695469#else
54705470 garray_T ga ;
54715471#endif
54725472 jobopt_T opt ;
54735473 ch_part_T part ;
5474- int len ;
54755474 int i ;
54765475
54775476 job = job_alloc ();
@@ -5550,7 +5549,15 @@ job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg)
55505549#ifdef USE_ARGV
55515550 if (argv_arg != NULL )
55525551 {
5553- argv = argv_arg ;
5552+ /* Make a copy of argv_arg for job->jv_argv. */
5553+ for (i = 0 ; argv_arg [i ] != NULL ; i ++ )
5554+ argc ++ ;
5555+ argv = (char * * )alloc (sizeof (char_u * ) * (argc + 1 ));
5556+ if (argv == NULL )
5557+ goto theend ;
5558+ for (i = 0 ; i < argc ; i ++ )
5559+ argv [i ] = (char * )vim_strsave ((char_u * )argv_arg [i ]);
5560+ argv [argc ] = NULL ;
55545561 }
55555562 else
55565563#endif
@@ -5563,12 +5570,12 @@ job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg)
55635570 EMSG (_ (e_invarg ));
55645571 goto theend ;
55655572 }
5566- #ifdef USE_ARGV
55675573 /* This will modify "cmd". */
55685574 if (mch_parse_cmd (cmd , FALSE, & argv , & argc ) == FAIL )
55695575 goto theend ;
5576+ for (i = 0 ; i < argc ; i ++ )
5577+ argv [i ] = (char * )vim_strsave ((char_u * )argv [i ]);
55705578 argv [argc ] = NULL ;
5571- #endif
55725579 }
55735580 else if (argvars [0 ].v_type != VAR_LIST
55745581 || argvars [0 ].vval .v_list == NULL
@@ -5580,7 +5587,6 @@ job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg)
55805587 else
55815588 {
55825589 list_T * l = argvars [0 ].vval .v_list ;
5583- #ifdef USE_ARGV
55845590 listitem_T * li ;
55855591 char_u * s ;
55865592
@@ -5592,27 +5598,24 @@ job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg)
55925598 {
55935599 s = get_tv_string_chk (& li -> li_tv );
55945600 if (s == NULL )
5601+ {
5602+ for (i = 0 ; i < argc ; ++ i )
5603+ vim_free (argv [i ]);
55955604 goto theend ;
5596- argv [argc ++ ] = (char * )s ;
5605+ }
5606+ argv [argc ++ ] = (char * )vim_strsave (s );
55975607 }
55985608 argv [argc ] = NULL ;
5599- #else
5609+
5610+ #ifndef USE_ARGV
56005611 if (win32_build_cmd (l , & ga ) == FAIL )
56015612 goto theend ;
56025613 cmd = ga .ga_data ;
56035614#endif
56045615 }
56055616
5606- /* Save the command used to start the job */
5607- len = 0 ;
5608- for (i = 0 ; argv [i ] != NULL ; i ++ )
5609- len ++ ;
5610- job -> argv = (char_u * * )alloc (sizeof (char_u * ) * (len + 1 ));
5611- if (job -> argv == NULL )
5612- goto theend ;
5613- for (i = 0 ; argv [i ] != NULL ; i ++ )
5614- job -> argv [i ] = vim_strsave ((char_u * )argv [i ]);
5615- job -> argv [i ] = NULL ;
5617+ /* Save the command used to start the job. */
5618+ job -> jv_argv = (char_u * * )argv ;
56165619
56175620#ifdef USE_ARGV
56185621 if (ch_log_active ())
@@ -5640,12 +5643,11 @@ job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg)
56405643 channel_write_in (job -> jv_channel );
56415644
56425645theend :
5643- #ifdef USE_ARGV
5644- if (argv != argv_arg )
5645- vim_free (argv );
5646- #else
5646+ #ifndef USE_ARGV
56475647 vim_free (ga .ga_data );
56485648#endif
5649+ if ((char_u * * )argv != job -> jv_argv )
5650+ vim_free (argv );
56495651 free_job_options (& opt );
56505652 return job ;
56515653}
@@ -5716,8 +5718,9 @@ job_info(job_T *job, dict_T *dict)
57165718 if (l != NULL )
57175719 {
57185720 dict_add_list (dict , "cmd" , l );
5719- for (i = 0 ; job -> argv [i ] != NULL ; i ++ )
5720- list_append_string (l , job -> argv [i ], -1 );
5721+ if (job -> jv_argv != NULL )
5722+ for (i = 0 ; job -> jv_argv [i ] != NULL ; i ++ )
5723+ list_append_string (l , job -> jv_argv [i ], -1 );
57215724 }
57225725}
57235726
0 commit comments