From 08cab9608781c975b4acbad875862b842b29258d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 4 Mar 2017 14:37:18 +0100 Subject: patch 8.0.0405: v:progpath may become invalid after :cd Problem: v:progpath may become invalid after ":cd". Solution: Turn v:progpath into a full path if needed. --- src/main.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 387221c9d..1da2b84c5 100644 --- a/src/main.c +++ b/src/main.c @@ -57,6 +57,9 @@ static void main_start_gui(void); # if defined(HAS_SWAP_EXISTS_ACTION) static void check_swap_exists_action(void); # endif +# ifdef FEAT_EVAL +static void set_progpath(char_u *argv0); +# endif # if defined(FEAT_CLIENTSERVER) || defined(PROTO) static void exec_on_server(mparm_T *parmp); static void prepare_server(mparm_T *parmp); @@ -1694,7 +1697,7 @@ parse_command_name(mparm_T *parmp) #ifdef FEAT_EVAL set_vim_var_string(VV_PROGNAME, initstr, -1); - set_vim_var_string(VV_PROGPATH, (char_u *)parmp->argv[0], -1); + set_progpath((char_u *)parmp->argv[0]); #endif if (TOLOWER_ASC(initstr[0]) == 'r') @@ -3417,7 +3420,7 @@ check_swap_exists_action(void) } #endif -#endif +#endif /* NO_VIM_MAIN */ #if defined(STARTUPTIME) || defined(PROTO) static void time_diff(struct timeval *then, struct timeval *now); @@ -3525,6 +3528,30 @@ time_msg( #endif +#ifndef NO_VIM_MAIN + static void +set_progpath(char_u *argv0) +{ + char_u *val = argv0; + char_u buf[MAXPATHL]; + + /* A relative path containing a "/" will become invalid when using ":cd", + * turn it into a full path. + * On MS-Windows "vim.exe" is found in the current directory, thus also do + * it when there is no path and the file exists. */ + if ( !mch_isFullName(argv0) +# ifdef WIN32 + && mch_can_exe(argv0, NULL, TRUE) +# else + && gettail(argv0) != argv0 +# endif + && vim_FullName(argv0, buf, MAXPATHL, TRUE) != FAIL) + val = buf; + set_vim_var_string(VV_PROGPATH, val, -1); +} + +#endif /* NO_VIM_MAIN */ + #if (defined(FEAT_CLIENTSERVER) && !defined(NO_VIM_MAIN)) || defined(PROTO) /* -- cgit v1.2.1