diff options
author | Gisle Vanem <gvanem@yahoo.no> | 2014-02-07 11:15:56 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2014-02-07 11:15:56 +0200 |
commit | b981bfd197eb767e93739908e4ec49406c314894 (patch) | |
tree | 9f8ea688ca364b228229e28000fdb94dbe0e53e0 /w32 | |
parent | 88713683fed38fa5a7a649d065c73f4d945bade7 (diff) | |
download | gunmake-b981bfd197eb767e93739908e4ec49406c314894.tar.gz |
Improve error reporting in the Windows port when env size is too large.
w32/subproc/misc.c (arr2envblk): Compute and return the size of
the environment passed to child process.
w32/subproc/sub_proc.c (process_begin): If the call to
CreateProcess failed with EINVAL, and the required environment
size was larger than 32KB, assume it's a Windows XP limitation,
and display an error message to that effect.
w32/subproc/proc.h (arr2envblk): Update prototype.
Copyright-paperwork-exempt: yes
Diffstat (limited to 'w32')
-rw-r--r-- | w32/subproc/misc.c | 5 | ||||
-rw-r--r-- | w32/subproc/proc.h | 2 | ||||
-rw-r--r-- | w32/subproc/sub_proc.c | 8 |
3 files changed, 11 insertions, 4 deletions
diff --git a/w32/subproc/misc.c b/w32/subproc/misc.c index 96e43ae..5273fa0 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 62ebf65..2dad395 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 7cacac6..34cc85d 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); } } |