comparison src/channel.c @ 19245:5ed8297121fa v8.2.0181

patch 8.2.0181: problems parsing :term arguments Commit: https://github.com/vim/vim/commit/21109272f5b0d32c408dc292561c0b1f2f8ebc53 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Jan 30 16:27:20 2020 +0100 patch 8.2.0181: problems parsing :term arguments Problem: Problems parsing :term arguments. Solution: Improve parsing, fix memory leak, add tests. (Ozaki Kiichi, closes #5536)
author Bram Moolenaar <Bram@vim.org>
date Thu, 30 Jan 2020 16:30:04 +0100
parents d776967d0f0d
children 473d7084a4a1
comparison
equal deleted inserted replaced
19244:bb09b0f937ad 19245:5ed8297121fa
4785 part = part_from_char(*hi->hi_key); 4785 part = part_from_char(*hi->hi_key);
4786 4786
4787 if (!(supported & JO_OUT_IO)) 4787 if (!(supported & JO_OUT_IO))
4788 break; 4788 break;
4789 opt->jo_set |= JO_OUT_NAME << (part - PART_OUT); 4789 opt->jo_set |= JO_OUT_NAME << (part - PART_OUT);
4790 opt->jo_io_name[part] = 4790 opt->jo_io_name[part] = tv_get_string_buf_chk(item,
4791 tv_get_string_buf_chk(item, opt->jo_io_name_buf[part]); 4791 opt->jo_io_name_buf[part]);
4792 } 4792 }
4793 else if (STRCMP(hi->hi_key, "pty") == 0) 4793 else if (STRCMP(hi->hi_key, "pty") == 0)
4794 { 4794 {
4795 if (!(supported & JO_MODE)) 4795 if (!(supported & JO_MODE))
4796 break; 4796 break;
4951 else if (STRCMP(hi->hi_key, "term_name") == 0) 4951 else if (STRCMP(hi->hi_key, "term_name") == 0)
4952 { 4952 {
4953 if (!(supported2 & JO2_TERM_NAME)) 4953 if (!(supported2 & JO2_TERM_NAME))
4954 break; 4954 break;
4955 opt->jo_set2 |= JO2_TERM_NAME; 4955 opt->jo_set2 |= JO2_TERM_NAME;
4956 opt->jo_term_name = tv_get_string_chk(item); 4956 opt->jo_term_name = tv_get_string_buf_chk(item,
4957 opt->jo_term_name_buf);
4957 if (opt->jo_term_name == NULL) 4958 if (opt->jo_term_name == NULL)
4958 { 4959 {
4959 semsg(_(e_invargval), "term_name"); 4960 semsg(_(e_invargval), "term_name");
4960 return FAIL; 4961 return FAIL;
4961 } 4962 }
4978 char_u *p; 4979 char_u *p;
4979 4980
4980 if (!(supported2 & JO2_TERM_OPENCMD)) 4981 if (!(supported2 & JO2_TERM_OPENCMD))
4981 break; 4982 break;
4982 opt->jo_set2 |= JO2_TERM_OPENCMD; 4983 opt->jo_set2 |= JO2_TERM_OPENCMD;
4983 p = opt->jo_term_opencmd = tv_get_string_chk(item); 4984 p = opt->jo_term_opencmd = tv_get_string_buf_chk(item,
4985 opt->jo_term_opencmd_buf);
4984 if (p != NULL) 4986 if (p != NULL)
4985 { 4987 {
4986 // Must have %d and no other %. 4988 // Must have %d and no other %.
4987 p = vim_strchr(p, '%'); 4989 p = vim_strchr(p, '%');
4988 if (p != NULL && (p[1] != 'd' 4990 if (p != NULL && (p[1] != 'd'
4995 return FAIL; 4997 return FAIL;
4996 } 4998 }
4997 } 4999 }
4998 else if (STRCMP(hi->hi_key, "eof_chars") == 0) 5000 else if (STRCMP(hi->hi_key, "eof_chars") == 0)
4999 { 5001 {
5000 char_u *p;
5001
5002 if (!(supported2 & JO2_EOF_CHARS)) 5002 if (!(supported2 & JO2_EOF_CHARS))
5003 break; 5003 break;
5004 opt->jo_set2 |= JO2_EOF_CHARS; 5004 opt->jo_set2 |= JO2_EOF_CHARS;
5005 p = opt->jo_eof_chars = tv_get_string_chk(item); 5005 opt->jo_eof_chars = tv_get_string_buf_chk(item,
5006 if (p == NULL) 5006 opt->jo_eof_chars_buf);
5007 if (opt->jo_eof_chars == NULL)
5007 { 5008 {
5008 semsg(_(e_invargval), "eof_chars"); 5009 semsg(_(e_invargval), "eof_chars");
5009 return FAIL; 5010 return FAIL;
5010 } 5011 }
5011 } 5012 }
5080 else if (STRCMP(hi->hi_key, "term_kill") == 0) 5081 else if (STRCMP(hi->hi_key, "term_kill") == 0)
5081 { 5082 {
5082 if (!(supported2 & JO2_TERM_KILL)) 5083 if (!(supported2 & JO2_TERM_KILL))
5083 break; 5084 break;
5084 opt->jo_set2 |= JO2_TERM_KILL; 5085 opt->jo_set2 |= JO2_TERM_KILL;
5085 opt->jo_term_kill = tv_get_string_chk(item); 5086 opt->jo_term_kill = tv_get_string_buf_chk(item,
5087 opt->jo_term_kill_buf);
5088 if (opt->jo_term_kill == NULL)
5089 {
5090 semsg(_(e_invargval), "term_kill");
5091 return FAIL;
5092 }
5086 } 5093 }
5087 else if (STRCMP(hi->hi_key, "tty_type") == 0) 5094 else if (STRCMP(hi->hi_key, "tty_type") == 0)
5088 { 5095 {
5089 char_u *p; 5096 char_u *p;
5090 5097
5155 { 5162 {
5156 if (!(supported2 & JO2_TERM_API)) 5163 if (!(supported2 & JO2_TERM_API))
5157 break; 5164 break;
5158 opt->jo_set2 |= JO2_TERM_API; 5165 opt->jo_set2 |= JO2_TERM_API;
5159 opt->jo_term_api = tv_get_string_buf_chk(item, 5166 opt->jo_term_api = tv_get_string_buf_chk(item,
5160 opt->jo_term_api_buf); 5167 opt->jo_term_api_buf);
5168 if (opt->jo_term_api == NULL)
5169 {
5170 semsg(_(e_invargval), "term_api");
5171 return FAIL;
5172 }
5161 } 5173 }
5162 #endif 5174 #endif
5163 else if (STRCMP(hi->hi_key, "env") == 0) 5175 else if (STRCMP(hi->hi_key, "env") == 0)
5164 { 5176 {
5165 if (!(supported2 & JO2_ENV)) 5177 if (!(supported2 & JO2_ENV))
5245 { 5257 {
5246 if (!(supported & JO_STOPONEXIT)) 5258 if (!(supported & JO_STOPONEXIT))
5247 break; 5259 break;
5248 opt->jo_set |= JO_STOPONEXIT; 5260 opt->jo_set |= JO_STOPONEXIT;
5249 opt->jo_stoponexit = tv_get_string_buf_chk(item, 5261 opt->jo_stoponexit = tv_get_string_buf_chk(item,
5250 opt->jo_soe_buf); 5262 opt->jo_stoponexit_buf);
5251 if (opt->jo_stoponexit == NULL) 5263 if (opt->jo_stoponexit == NULL)
5252 { 5264 {
5253 semsg(_(e_invargval), "stoponexit"); 5265 semsg(_(e_invargval), "stoponexit");
5254 return FAIL; 5266 return FAIL;
5255 } 5267 }
5815 job_T * 5827 job_T *
5816 job_start( 5828 job_start(
5817 typval_T *argvars, 5829 typval_T *argvars,
5818 char **argv_arg UNUSED, 5830 char **argv_arg UNUSED,
5819 jobopt_T *opt_arg, 5831 jobopt_T *opt_arg,
5820 int is_terminal UNUSED) 5832 job_T **term_job)
5821 { 5833 {
5822 job_T *job; 5834 job_T *job;
5823 char_u *cmd = NULL; 5835 char_u *cmd = NULL;
5824 char **argv = NULL; 5836 char **argv = NULL;
5825 int argc = 0; 5837 int argc = 0;
5966 } 5978 }
5967 5979
5968 // Save the command used to start the job. 5980 // Save the command used to start the job.
5969 job->jv_argv = argv; 5981 job->jv_argv = argv;
5970 5982
5983 if (term_job != NULL)
5984 *term_job = job;
5985
5971 #ifdef USE_ARGV 5986 #ifdef USE_ARGV
5972 if (ch_log_active()) 5987 if (ch_log_active())
5973 { 5988 {
5974 garray_T ga; 5989 garray_T ga;
5975 5990
5982 } 5997 }
5983 ga_append(&ga, NUL); 5998 ga_append(&ga, NUL);
5984 ch_log(NULL, "Starting job: %s", (char *)ga.ga_data); 5999 ch_log(NULL, "Starting job: %s", (char *)ga.ga_data);
5985 ga_clear(&ga); 6000 ga_clear(&ga);
5986 } 6001 }
5987 mch_job_start(argv, job, &opt, is_terminal); 6002 mch_job_start(argv, job, &opt, term_job != NULL);
5988 #else 6003 #else
5989 ch_log(NULL, "Starting job: %s", (char *)cmd); 6004 ch_log(NULL, "Starting job: %s", (char *)cmd);
5990 mch_job_start((char *)cmd, job, &opt); 6005 mch_job_start((char *)cmd, job, &opt);
5991 #endif 6006 #endif
5992 6007
6598 f_job_start(typval_T *argvars, typval_T *rettv) 6613 f_job_start(typval_T *argvars, typval_T *rettv)
6599 { 6614 {
6600 rettv->v_type = VAR_JOB; 6615 rettv->v_type = VAR_JOB;
6601 if (check_restricted() || check_secure()) 6616 if (check_restricted() || check_secure())
6602 return; 6617 return;
6603 rettv->vval.v_job = job_start(argvars, NULL, NULL, FALSE); 6618 rettv->vval.v_job = job_start(argvars, NULL, NULL, NULL);
6604 } 6619 }
6605 6620
6606 /* 6621 /*
6607 * "job_status()" function 6622 * "job_status()" function
6608 */ 6623 */