Improve error reporting in the Windows port when env size is too large.
authorGisle Vanem <gvanem@yahoo.no>
Fri, 7 Feb 2014 09:15:56 +0000 (11:15 +0200)
committerEli Zaretskii <eliz@gnu.org>
Fri, 7 Feb 2014 09:15:56 +0000 (11:15 +0200)
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

w32/subproc/misc.c
w32/subproc/proc.h
w32/subproc/sub_proc.c

index 96e43aee2d5170f07a7ecd5c125c7cdfbb3f5ca4..5273fa0cb8aa17c10e4c0b8c6f378997d8e79830 100644 (file)
@@ -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);
 
index 62ebf65f55debfcdc9d8529793db434a9b265131..2dad3953894f4538ff4466dfea1f746f3724257d 100644 (file)
@@ -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
index 7cacac67474eae7b6f9c8430c40611798b96b2ea..34cc85d2077c2f3dd86435f75371a829dbfca87c 100644 (file)
@@ -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);
                 }
         }