* spawn.cc (av): Hide 'calloced' field and limit cstrduping to class methods

only.
(spawn_guts): Use methods for manipulating most newargv stuff.
* child_info.h (child_info_spawn::~child_info_spawn): Avoid memory leaks in
cygheap.
* spawn.cc (spawn_guts): Ditto.
* dcrt0.cc (quoted): Return next character after a quoted string when not doing
special quote processing.  Also ensure that non-NULL is returned in all circumstances.
* spawn.cc (spawn_guts): Ensure that argv[0] is correctly set to the full path
when a script is detected.  Suggested by Kazuhiro Fujieda
<fujieda@jaist.ac.jp>.
This commit is contained in:
Christopher Faylor 2000-09-13 19:57:00 +00:00
parent 7f18fcb4cb
commit 99d7d12af0
4 changed files with 64 additions and 15 deletions

View File

@ -1,3 +1,27 @@
Wed Sep 13 14:56:47 2000 Christopher Faylor <cgf@cygnus.com>
* spawn.cc (av): Hide 'calloced' field and limit cstrduping to class
methods only.
(spawn_guts): Use methods for manipulating most newargv stuff.
2000-09-13 Egor Duda <deo@logos-m.ru>
* child_info.h (child_info_spawn::~child_info_spawn): Avoid
memory leaks in cygheap.
* spawn.cc (spawn_guts): Ditto.
Wed Sep 13 14:28:03 2000 Christopher Faylor <cgf@cygnus.com>
* dcrt0.cc (quoted): Return next character after a quoted string when
not doing special quote processing. Also ensure that non-NULL is
returned in all circumstances.
Wed Sep 13 10:26:16 2000 Christopher Faylor <cgf@cygnus.com>
* spawn.cc (spawn_guts): Ensure that argv[0] is correctly set to the
full path when a script is detected. Suggested by Kazuhiro Fujieda
<fujieda@jaist.ac.jp>.
Tue Sep 12 22:33:30 2000 Christopher Faylor <cgf@cygnus.com> Tue Sep 12 22:33:30 2000 Christopher Faylor <cgf@cygnus.com>
* external.cc (fillout_pinfo): Handle explicit pids correctly. * external.cc (fillout_pinfo): Handle explicit pids correctly.

View File

@ -87,6 +87,10 @@ public:
{ {
if (moreinfo->old_title) if (moreinfo->old_title)
cfree (moreinfo->old_title); cfree (moreinfo->old_title);
if (moreinfo->cwd_posix)
cfree (moreinfo->cwd_posix);
if (moreinfo->cwd_win32)
cfree (moreinfo->cwd_win32);
if (moreinfo->environ) if (moreinfo->environ)
{ {
for (char **e = moreinfo->environ; *e; e++) for (char **e = moreinfo->environ; *e; e++)

View File

@ -307,7 +307,7 @@ quoted (char *cmd, int winshell)
strcpy (cmd, cmd + 1); strcpy (cmd, cmd + 1);
if ((p = strchr (cmd, quote)) != NULL) if ((p = strchr (cmd, quote)) != NULL)
strcpy (p, p + 1); strcpy (p, p + 1);
return p + 1; return p;
} }
/* This must have been run from a Windows shell, so preserve /* This must have been run from a Windows shell, so preserve

View File

@ -244,14 +244,13 @@ exec_fixup_after_fork ()
hexec_proc = NULL; hexec_proc = NULL;
} }
struct av class av
{ {
int argc;
int calloced;
private:
char **argv; char **argv;
int calloced;
public: public:
av (int ac, const char * const *av) : argc (ac), calloced (0) int argc;
av (int ac, const char * const *av) : calloced (0), argc (ac)
{ {
argv = (char **) cmalloc (HEAP_ARGV, (argc + 1) * sizeof (char *)); argv = (char **) cmalloc (HEAP_ARGV, (argc + 1) * sizeof (char *));
memcpy (argv, av, (argc + 1) * sizeof (char *)); memcpy (argv, av, (argc + 1) * sizeof (char *));
@ -264,6 +263,26 @@ public:
} }
int unshift (const char *what, int conv = 0); int unshift (const char *what, int conv = 0);
operator char **() {return argv;} operator char **() {return argv;}
void all_calloced () {calloced = argc;}
void replace0_maybe (const char *arg0)
{
/* Note: Assumes that argv array has not yet been "unshifted" */
if (!calloced)
{
argv[0] = cstrdup (arg0);
calloced = 1;
}
}
void *dup_maybe (int i)
{
if (i >= calloced)
argv[i] = cstrdup (argv[i]);
}
void dup_all ()
{
for (int i = calloced; i < argc; i++)
argv[i] = cstrdup (argv[i]);
}
}; };
int int
@ -303,7 +322,6 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
MALLOC_CHECK; MALLOC_CHECK;
// if (strstr (prog_arg, "dopath")) try_to_debug ();
if (prog_arg == NULL) if (prog_arg == NULL)
{ {
syscall_printf ("prog_arg is NULL"); syscall_printf ("prog_arg is NULL");
@ -417,18 +435,18 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
if (buf[0] == 'M' && buf[1] == 'Z') if (buf[0] == 'M' && buf[1] == 'Z')
break; break;
debug_printf ("%s is a script", prog_arg); debug_printf ("%s is a script", (char *) real_path);
char *ptr, *pgm, *arg1; char *pgm, *arg1;
if (buf[0] != '#' || buf[1] != '!') if (buf[0] != '#' || buf[1] != '!')
{ {
pgm = (char *) "/bin/sh"; pgm = (char *) "/bin/sh";
ptr = buf + 2;
arg1 = NULL; arg1 = NULL;
} }
else else
{ {
char *ptr;
pgm = buf + 2; pgm = buf + 2;
pgm += strspn (pgm, " \t"); pgm += strspn (pgm, " \t");
for (ptr = pgm, arg1 = NULL; for (ptr = pgm, arg1 = NULL;
@ -453,10 +471,13 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
*ptr = '\0'; *ptr = '\0';
} }
/* Replace argv[0] with the full path to the script if this is the
first time through the loop. */
newargv.replace0_maybe (real_path);
/* pointers: /* pointers:
* pgm interpreter name * pgm interpreter name
* arg1 optional string * arg1 optional string
* ptr end of string
*/ */
if (arg1) if (arg1)
newargv.unshift (arg1); newargv.unshift (arg1);
@ -466,8 +487,7 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
} }
if (real_path.iscygexec ()) if (real_path.iscygexec ())
for (int i = newargv.calloced; i < newargv.argc; i++) newargv.dup_all ();
newargv[i] = cstrdup (newargv[i]);
else else
{ {
for (int i = 0; i < newargv.argc; i++) for (int i = 0; i < newargv.argc; i++)
@ -475,8 +495,7 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
char *p = NULL; char *p = NULL;
const char *a; const char *a;
if (i >= newargv.calloced) newargv.dup_maybe (i);
newargv[i] = cstrdup (newargv[i]);
a = newargv[i]; a = newargv[i];
int len = strlen (a); int len = strlen (a);
if (len != 0 && !strpbrk (a, " \t\n\r\"")) if (len != 0 && !strpbrk (a, " \t\n\r\""))
@ -507,6 +526,8 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
one_line.add ("", 1); one_line.add ("", 1);
MALLOC_CHECK; MALLOC_CHECK;
} }
newargv.all_calloced ();
ciresrv.moreinfo->argc = newargv.argc; ciresrv.moreinfo->argc = newargv.argc;
ciresrv.moreinfo->argv = newargv; ciresrv.moreinfo->argv = newargv;