@@ -906,6 +906,36 @@ static int compareenv(const void *a, const void *b)
906
906
return strcasecmp (* ea , * eb );
907
907
}
908
908
909
+ /*
910
+ * Create environment block suitable for CreateProcess.
911
+ */
912
+ static wchar_t * make_environment_block (char * * env )
913
+ {
914
+ wchar_t * wenvblk = NULL ;
915
+ int count = 0 ;
916
+ char * * e , * * tmpenv ;
917
+ int size = 0 , wenvsz = 0 , wenvpos = 0 ;
918
+
919
+ for (e = env ; * e ; e ++ )
920
+ count ++ ;
921
+
922
+ /* environment must be sorted */
923
+ tmpenv = xmalloc (sizeof (* tmpenv ) * (count + 1 ));
924
+ memcpy (tmpenv , env , sizeof (* tmpenv ) * (count + 1 ));
925
+ qsort (tmpenv , count , sizeof (* tmpenv ), compareenv );
926
+
927
+ /* create environment block from temporary environment */
928
+ for (e = tmpenv ; * e ; e ++ ) {
929
+ size = 2 * strlen (* e ) + 2 ; /* +2 for final \0 */
930
+ ALLOC_GROW (wenvblk , (wenvpos + size ) * sizeof (wchar_t ), wenvsz );
931
+ wenvpos += xutftowcs (& wenvblk [wenvpos ], * e , size ) + 1 ;
932
+ }
933
+ /* add final \0 terminator */
934
+ wenvblk [wenvpos ] = 0 ;
935
+ free (tmpenv );
936
+ return wenvblk ;
937
+ }
938
+
909
939
struct pinfo_t {
910
940
struct pinfo_t * next ;
911
941
pid_t pid ;
@@ -982,29 +1012,8 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
982
1012
xutftowcs (wargs , args .buf , 2 * args .len + 1 );
983
1013
strbuf_release (& args );
984
1014
985
- if (env ) {
986
- int count = 0 ;
987
- char * * e , * * sorted_env ;
988
- int size = 0 , wenvsz = 0 , wenvpos = 0 ;
989
-
990
- for (e = env ; * e ; e ++ )
991
- count ++ ;
992
-
993
- /* environment must be sorted */
994
- sorted_env = xmalloc (sizeof (* sorted_env ) * (count + 1 ));
995
- memcpy (sorted_env , env , sizeof (* sorted_env ) * (count + 1 ));
996
- qsort (sorted_env , count , sizeof (* sorted_env ), compareenv );
997
-
998
- /* create environment block from temporary environment */
999
- for (e = sorted_env ; * e ; e ++ ) {
1000
- size = 2 * strlen (* e ) + 2 ; /* +2 for final \0 */
1001
- ALLOC_GROW (wenvblk , (wenvpos + size ) * sizeof (wchar_t ), wenvsz );
1002
- wenvpos += xutftowcs (& wenvblk [wenvpos ], * e , size ) + 1 ;
1003
- }
1004
- /* add final \0 terminator */
1005
- wenvblk [wenvpos ] = 0 ;
1006
- free (sorted_env );
1007
- }
1015
+ if (env )
1016
+ wenvblk = make_environment_block (env );
1008
1017
1009
1018
memset (& pi , 0 , sizeof (pi ));
1010
1019
ret = CreateProcessW (wcmd , wargs , NULL , NULL , TRUE, flags ,
0 commit comments