diff --git a/w32/subproc/misc.c b/w32/subproc/misc.c index 96e43aee..5273fa0c 100644 --- a/w32/subproc/misc.c +++ b/w32/subproc/misc.c @@ -36,7 +36,7 @@ int _cdecl compare(const void *a1, const void *a2) return _stricoll(*((char**)a1),*((char**)a2)); } bool_t -arr2envblk(char **arr, char **envblk_out) +arr2envblk(char **arr, char **envblk_out, int *envsize_needed) { char **tmp; int size_needed; @@ -54,13 +54,14 @@ arr2envblk(char **arr, char **envblk_out) } arrcnt = 0; - size_needed = 0; + size_needed = *envsize_needed = 0; while (arr[arrcnt]) { tmp[arrcnt] = arr[arrcnt]; size_needed += strlen(arr[arrcnt]) + 1; arrcnt++; } size_needed++; + *envsize_needed = size_needed; qsort((void *) tmp, (size_t) arrcnt, sizeof (char*), compare); diff --git a/w32/subproc/proc.h b/w32/subproc/proc.h index 62ebf65f..2dad3953 100644 --- a/w32/subproc/proc.h +++ b/w32/subproc/proc.h @@ -24,6 +24,6 @@ typedef int bool_t; #define E_NO_MEM 103 #define E_FORK 104 -extern bool_t arr2envblk(char **arr, char **envblk_out); +extern bool_t arr2envblk(char **arr, char **envblk_out, int *envsize_needed); #endif diff --git a/w32/subproc/sub_proc.c b/w32/subproc/sub_proc.c index 7cacac67..34cc85d2 100644 --- a/w32/subproc/sub_proc.c +++ b/w32/subproc/sub_proc.c @@ -593,6 +593,7 @@ process_begin( STARTUPINFO startInfo; PROCESS_INFORMATION procInfo; char *envblk=NULL; + int envsize_needed = 0; int pass_null_exec_path = 0; /* @@ -734,10 +735,15 @@ process_begin( } if (envp) { - if (arr2envblk(envp, &envblk) ==FALSE) { + if (arr2envblk(envp, &envblk, &envsize_needed) == FALSE) { pproc->last_err = 0; pproc->lerrno = E_NO_MEM; free( command_line ); + if (pproc->last_err == ERROR_INVALID_PARAMETER + && envsize_needed > 32*1024) { + fprintf (stderr, "CreateProcess failed, probably because environment is too large (%d bytes).\n", + envsize_needed); + } return(-1); } }