* spawn.cc (spawn_guts): Revert patch which treated derived cygwin programs

differently from those which are mounted with -X.  Pass extra argument to
linebuf::fromargv.
* winf.h (MAXCYGWINCMDLEN): New define.
(linebuf::finish): Add a new argument denoting when command line overflow is
ok.
(linebuf::fromargv): Ditto.
* winf.cc (linebuf::finish): Implement above change.
(linebuf::fromargv): Ditto.
This commit is contained in:
Christopher Faylor 2006-04-13 01:37:00 +00:00
parent a5eaf56817
commit 2e9d484382
4 changed files with 35 additions and 9 deletions

View File

@ -1,3 +1,16 @@
2006-04-12 Corinna Vinschen <corinna@vinschen.de>
Christopher Faylor <cgf@timesys.com>
* spawn.cc (spawn_guts): Revert patch which treated derived cygwin
programs differently from those which are mounted with -X. Pass extra
argument to linebuf::fromargv.
* winf.h (MAXCYGWINCMDLEN): New define.
(linebuf::finish): Add a new argument denoting when command line
overflow is ok.
(linebuf::fromargv): Ditto.
* winf.cc (linebuf::finish): Implement above change.
(linebuf::fromargv): Ditto.
2006-04-11 Christopher Faylor <cgf@timesys.com> 2006-04-11 Christopher Faylor <cgf@timesys.com>
* Makefile.in (DLL_OFILES): Add winf.o. * Makefile.in (DLL_OFILES): Add winf.o.

View File

@ -347,6 +347,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
goto out; goto out;
} }
bool wascygexec = real_path.iscygexec ();
res = newargv.fixup (prog_arg, real_path, ext); res = newargv.fixup (prog_arg, real_path, ext);
if (res) if (res)
@ -371,9 +372,9 @@ spawn_guts (const char * prog_arg, const char *const *argv,
} }
else else
{ {
if (real_path.iscygexec ()) if (wascygexec)
newargv.dup_all (); newargv.dup_all ();
else if (!one_line.fromargv (newargv, real_path)) else if (!one_line.fromargv (newargv, real_path, real_path.iscygexec ()))
{ {
res = -1; res = -1;
goto out; goto out;
@ -461,6 +462,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
cygheap->fdtab.set_file_pointers_for_exec (); cygheap->fdtab.set_file_pointers_for_exec ();
ch.set (chtype, real_path.iscygexec ());
moreinfo->envp = build_env (envp, envblock, moreinfo->envc, real_path.iscygexec ()); moreinfo->envp = build_env (envp, envblock, moreinfo->envc, real_path.iscygexec ());
if (!moreinfo->envp || !envblock) if (!moreinfo->envp || !envblock)
{ {
@ -468,7 +470,6 @@ spawn_guts (const char * prog_arg, const char *const *argv,
res = -1; res = -1;
goto out; goto out;
} }
ch.set (chtype, real_path.iscygexec ());
ch.moreinfo = moreinfo; ch.moreinfo = moreinfo;
si.lpReserved2 = (LPBYTE) &ch; si.lpReserved2 = (LPBYTE) &ch;

View File

@ -19,12 +19,16 @@ details. */
#include "sys/cygwin.h" #include "sys/cygwin.h"
void void
linebuf::finish () linebuf::finish (bool cmdlenoverflow_ok)
{ {
if (!ix) if (!ix)
add ("", 1); add ("", 1);
else else
buf[--ix] = '\0'; {
if (ix-- > MAXCYGWINCMDLEN && cmdlenoverflow_ok)
ix = MAXCYGWINCMDLEN - 1;
buf[ix] = '\0';
}
} }
void void
@ -61,7 +65,7 @@ linebuf::prepend (const char *what, int len)
} }
bool bool
linebuf::fromargv (av& newargv, char *real_path) linebuf::fromargv (av& newargv, char *real_path, bool cmdlenoverflow_ok)
{ {
bool success = true; bool success = true;
for (int i = 0; i < newargv.argc; i++) for (int i = 0; i < newargv.argc; i++)
@ -110,7 +114,7 @@ linebuf::fromargv (av& newargv, char *real_path)
add (" ", 1); add (" ", 1);
} }
finish (); finish (cmdlenoverflow_ok);
if (ix >= MAXWINCMDLEN) if (ix >= MAXWINCMDLEN)
{ {

View File

@ -9,6 +9,14 @@ details. */
#ifndef _WINF_H #ifndef _WINF_H
#define _WINF_H #define _WINF_H
/* Hack for Cygwin processes. If the Windows command line length gets slightly
bigger than this value, the stack position is suddenly moved up by 64K for
no apparent reason, which results in subsequent forks failing. Since Cygwin
processes get the full command line as argv array anyway, this only affects
the maximum command line length of Cygwin applications which non-sensically
have a WinMain instead of a main entry point. */
#define MAXCYGWINCMDLEN 31767
#define MAXWINCMDLEN 32767 #define MAXWINCMDLEN 32767
#define LINE_BUF_CHUNK (CYG_MAX_PATH * 2) #define LINE_BUF_CHUNK (CYG_MAX_PATH * 2)
@ -74,8 +82,8 @@ class linebuf
void add (const char *what, int len) __attribute__ ((regparm (3))); void add (const char *what, int len) __attribute__ ((regparm (3)));
void add (const char *what) {add (what, strlen (what));} void add (const char *what) {add (what, strlen (what));}
void prepend (const char *what, int len); void prepend (const char *what, int len);
void finish () __attribute__ ((regparm (1))); void finish (bool) __attribute__ ((regparm (2)));
bool fromargv(av&, char *); bool fromargv(av&, char *, bool) __attribute__ ((regparm (3)));;
operator char *() {return buf;} operator char *() {return buf;}
}; };