* 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>
* external.cc (fillout_pinfo): Handle explicit pids correctly.

View File

@ -87,6 +87,10 @@ public:
{
if (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)
{
for (char **e = moreinfo->environ; *e; e++)

View File

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

View File

@ -244,14 +244,13 @@ exec_fixup_after_fork ()
hexec_proc = NULL;
}
struct av
class av
{
int argc;
int calloced;
private:
char **argv;
int calloced;
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 *));
memcpy (argv, av, (argc + 1) * sizeof (char *));
@ -264,6 +263,26 @@ public:
}
int unshift (const char *what, int conv = 0);
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
@ -303,7 +322,6 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
MALLOC_CHECK;
// if (strstr (prog_arg, "dopath")) try_to_debug ();
if (prog_arg == 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')
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] != '!')
{
pgm = (char *) "/bin/sh";
ptr = buf + 2;
arg1 = NULL;
}
else
{
char *ptr;
pgm = buf + 2;
pgm += strspn (pgm, " \t");
for (ptr = pgm, arg1 = NULL;
@ -453,10 +471,13 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
*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:
* pgm interpreter name
* arg1 optional string
* ptr end of string
*/
if (arg1)
newargv.unshift (arg1);
@ -466,8 +487,7 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
}
if (real_path.iscygexec ())
for (int i = newargv.calloced; i < newargv.argc; i++)
newargv[i] = cstrdup (newargv[i]);
newargv.dup_all ();
else
{
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;
const char *a;
if (i >= newargv.calloced)
newargv[i] = cstrdup (newargv[i]);
newargv.dup_maybe (i);
a = newargv[i];
int len = strlen (a);
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);
MALLOC_CHECK;
}
newargv.all_calloced ();
ciresrv.moreinfo->argc = newargv.argc;
ciresrv.moreinfo->argv = newargv;