summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGisle Vanem <gvanem@yahoo.no>2014-02-07 11:15:56 +0200
committerEli Zaretskii <eliz@gnu.org>2014-02-07 11:15:56 +0200
commitb981bfd197eb767e93739908e4ec49406c314894 (patch)
tree9f8ea688ca364b228229e28000fdb94dbe0e53e0
parent88713683fed38fa5a7a649d065c73f4d945bade7 (diff)
downloadgunmake-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
-rw-r--r--w32/subproc/misc.c5
-rw-r--r--w32/subproc/proc.h2
-rw-r--r--w32/subproc/sub_proc.c8
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);
}
}