* 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:
parent
a5eaf56817
commit
2e9d484382
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue