@@ -441,7 +441,7 @@ static int do_lstat(int follow, const char *file_name, struct stat *buf)
441
441
static int do_stat_internal (int follow , const char * file_name , struct stat * buf )
442
442
{
443
443
int namelen ;
444
- static char alt_name [PATH_MAX ];
444
+ char alt_name [PATH_MAX ];
445
445
446
446
if (!do_lstat (follow , file_name , buf ))
447
447
return 0 ;
@@ -831,9 +831,10 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
831
831
const char * dir ,
832
832
int prepend_cmd , int fhin , int fhout , int fherr )
833
833
{
834
- STARTUPINFO si ;
834
+ STARTUPINFOW si ;
835
835
PROCESS_INFORMATION pi ;
836
836
struct strbuf envblk , args ;
837
+ wchar_t wcmd [MAX_PATH ], wdir [MAX_PATH ], * wargs ;
837
838
unsigned flags ;
838
839
BOOL ret ;
839
840
@@ -869,6 +870,11 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
869
870
si .hStdOutput = winansi_get_osfhandle (fhout );
870
871
si .hStdError = winansi_get_osfhandle (fherr );
871
872
873
+ if (xutftowcs_path (wcmd , cmd ) < 0 )
874
+ return -1 ;
875
+ if (dir && xutftowcs_path (wdir , dir ) < 0 )
876
+ return -1 ;
877
+
872
878
/* concatenate argv, quoting args as we go */
873
879
strbuf_init (& args , 0 );
874
880
if (prepend_cmd ) {
@@ -886,6 +892,10 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
886
892
free (quoted );
887
893
}
888
894
895
+ wargs = xmalloc ((2 * args .len + 1 ) * sizeof (wchar_t ));
896
+ xutftowcs (wargs , args .buf , 2 * args .len + 1 );
897
+ strbuf_release (& args );
898
+
889
899
if (env ) {
890
900
int count = 0 ;
891
901
char * * e , * * sorted_env ;
@@ -907,12 +917,12 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
907
917
}
908
918
909
919
memset (& pi , 0 , sizeof (pi ));
910
- ret = CreateProcess ( cmd , args . buf , NULL , NULL , TRUE, flags ,
911
- env ? envblk .buf : NULL , dir , & si , & pi );
920
+ ret = CreateProcessW ( wcmd , wargs , NULL , NULL , TRUE, flags ,
921
+ env ? envblk .buf : NULL , dir ? wdir : NULL , & si , & pi );
912
922
913
923
if (env )
914
924
strbuf_release (& envblk );
915
- strbuf_release ( & args );
925
+ free ( wargs );
916
926
917
927
if (!ret ) {
918
928
errno = ENOENT ;
@@ -941,10 +951,9 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
941
951
return (pid_t )pi .dwProcessId ;
942
952
}
943
953
944
- static pid_t mingw_spawnve (const char * cmd , const char * * argv , char * * env ,
945
- int prepend_cmd )
954
+ static pid_t mingw_spawnv (const char * cmd , const char * * argv , int prepend_cmd )
946
955
{
947
- return mingw_spawnve_fd (cmd , argv , env , NULL , prepend_cmd , 0 , 1 , 2 );
956
+ return mingw_spawnve_fd (cmd , argv , environ , NULL , prepend_cmd , 0 , 1 , 2 );
948
957
}
949
958
950
959
pid_t mingw_spawnvpe (const char * cmd , const char * * argv , char * * env ,
@@ -986,7 +995,7 @@ pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env,
986
995
return pid ;
987
996
}
988
997
989
- static int try_shell_exec (const char * cmd , char * const * argv , char * * env )
998
+ static int try_shell_exec (const char * cmd , char * const * argv )
990
999
{
991
1000
const char * interpr = parse_interpreter (cmd );
992
1001
char * * path ;
@@ -1004,7 +1013,7 @@ static int try_shell_exec(const char *cmd, char *const *argv, char **env)
1004
1013
argv2 = xmalloc (sizeof (* argv ) * (argc + 1 ));
1005
1014
argv2 [0 ] = (char * )cmd ; /* full path to the script file */
1006
1015
memcpy (& argv2 [1 ], & argv [1 ], sizeof (* argv ) * argc );
1007
- pid = mingw_spawnve (prog , argv2 , env , 1 );
1016
+ pid = mingw_spawnv (prog , argv2 , 1 );
1008
1017
if (pid >= 0 ) {
1009
1018
int status ;
1010
1019
if (waitpid (pid , & status , 0 ) < 0 )
@@ -1019,19 +1028,20 @@ static int try_shell_exec(const char *cmd, char *const *argv, char **env)
1019
1028
return pid ;
1020
1029
}
1021
1030
1022
- static void mingw_execve (const char * cmd , char * const * argv , char * const * env )
1031
+ int mingw_execv (const char * cmd , char * const * argv )
1023
1032
{
1024
1033
/* check if git_command is a shell script */
1025
- if (!try_shell_exec (cmd , argv , ( char * * ) env )) {
1034
+ if (!try_shell_exec (cmd , argv )) {
1026
1035
int pid , status ;
1027
1036
1028
- pid = mingw_spawnve (cmd , (const char * * )argv , ( char * * ) env , 0 );
1037
+ pid = mingw_spawnv (cmd , (const char * * )argv , 0 );
1029
1038
if (pid < 0 )
1030
- return ;
1039
+ return -1 ;
1031
1040
if (waitpid (pid , & status , 0 ) < 0 )
1032
1041
status = 255 ;
1033
1042
exit (status );
1034
1043
}
1044
+ return -1 ;
1035
1045
}
1036
1046
1037
1047
int mingw_execvp (const char * cmd , char * const * argv )
@@ -1040,7 +1050,7 @@ int mingw_execvp(const char *cmd, char *const *argv)
1040
1050
char * prog = path_lookup (cmd , path , 0 );
1041
1051
1042
1052
if (prog ) {
1043
- mingw_execve (prog , argv , environ );
1053
+ mingw_execv (prog , argv );
1044
1054
free (prog );
1045
1055
} else
1046
1056
errno = ENOENT ;
@@ -1049,12 +1059,6 @@ int mingw_execvp(const char *cmd, char *const *argv)
1049
1059
return -1 ;
1050
1060
}
1051
1061
1052
- int mingw_execv (const char * cmd , char * const * argv )
1053
- {
1054
- mingw_execve (cmd , argv , environ );
1055
- return -1 ;
1056
- }
1057
-
1058
1062
int mingw_kill (pid_t pid , int sig )
1059
1063
{
1060
1064
if (pid > 0 && sig == SIGTERM ) {
@@ -1933,10 +1937,54 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
1933
1937
return -1 ;
1934
1938
}
1935
1939
1940
+ /*
1941
+ * Disable MSVCRT command line wildcard expansion (__getmainargs called from
1942
+ * mingw startup code, see init.c in mingw runtime).
1943
+ */
1944
+ int _CRT_glob = 0 ;
1945
+
1946
+ typedef struct {
1947
+ int newmode ;
1948
+ } _startupinfo ;
1949
+
1950
+ extern int __wgetmainargs (int * argc , wchar_t * * * argv , wchar_t * * * env , int glob ,
1951
+ _startupinfo * si );
1952
+
1953
+ static NORETURN void die_startup ()
1954
+ {
1955
+ fputs ("fatal: not enough memory for initialization" , stderr );
1956
+ exit (128 );
1957
+ }
1958
+
1936
1959
void mingw_startup ()
1937
1960
{
1938
- /* copy executable name to argv[0] */
1939
- __argv [0 ] = xstrdup (_pgmptr );
1961
+ int i , len , maxlen , argc ;
1962
+ char * buffer ;
1963
+ wchar_t * * wenv , * * wargv ;
1964
+ _startupinfo si ;
1965
+
1966
+ /* get wide char arguments and environment */
1967
+ si .newmode = 0 ;
1968
+ if (__wgetmainargs (& argc , & wargv , & wenv , _CRT_glob , & si ) < 0 )
1969
+ die_startup ();
1970
+
1971
+ /* determine size of argv and environ conversion buffer */
1972
+ maxlen = wcslen (_wpgmptr );
1973
+ for (i = 1 ; i < argc ; i ++ )
1974
+ maxlen = max (maxlen , wcslen (wargv [i ]));
1975
+
1976
+ /* allocate buffer (wchar_t encodes to max 3 UTF-8 bytes) */
1977
+ maxlen = 3 * maxlen + 1 ;
1978
+ buffer = xmalloc (maxlen );
1979
+
1980
+ /* convert command line arguments and environment to UTF-8 */
1981
+ len = xwcstoutf (buffer , _wpgmptr , maxlen );
1982
+ __argv [0 ] = xmemdupz (buffer , len );
1983
+ for (i = 1 ; i < argc ; i ++ ) {
1984
+ len = xwcstoutf (buffer , wargv [i ], maxlen );
1985
+ __argv [i ] = xmemdupz (buffer , len );
1986
+ }
1987
+ free (buffer );
1940
1988
1941
1989
/* initialize critical section for waitpid pinfo_t list */
1942
1990
InitializeCriticalSection (& pinfo_cs );
0 commit comments