Sync libiberty sources with gcc mainline.
2016-09-19 Andrew Stubbs <ams@codesourcery.com> * pex-win32.c (argv_to_cmdline): Quote zero-length parameters. * testsuite/test-pexecute.c (main): Insert check for zero-length parameters. 2016-09-10 Mark Wielaard <mjw@redhat.com> * cp-demangle.c (d_substitution): Change struct demangle_component variable name from c to dc. 2016-08-12 Marek Polacek <polacek@redhat.com> PR c/7652 * cp-demangle.c (d_print_mod): Add FALLTHRU. 2016-08-04 Marcel B?hme <boehme.marcel@gmail.com> PR c++/71696 * cplus-dem.c: Prevent infinite recursion when there is a cycle in the referencing of remembered mangled types. (work_stuff): New stack to keep track of the remembered mangled types that are currently being processed. (push_processed_type): New method to push currently processed remembered type onto the stack. (pop_processed_type): New method to pop currently processed remembered type from the stack. (work_stuff_copy_to_from): Copy values of new variables. (delete_non_B_K_work_stuff): Free stack memory. (demangle_args): Push/Pop currently processed remembered type. (do_type): Do not demangle a cyclic reference and push/pop referenced remembered type.
This commit is contained in:
parent
b89bd142d2
commit
41f225defe
5 changed files with 152 additions and 31 deletions
|
@ -1,3 +1,39 @@
|
||||||
|
2016-10-17 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* Sync with gcc.
|
||||||
|
|
||||||
|
2016-09-19 Andrew Stubbs <ams@codesourcery.com>
|
||||||
|
|
||||||
|
* pex-win32.c (argv_to_cmdline): Quote zero-length parameters.
|
||||||
|
* testsuite/test-pexecute.c (main): Insert check for zero-length parameters.
|
||||||
|
|
||||||
|
2016-09-10 Mark Wielaard <mjw@redhat.com>
|
||||||
|
|
||||||
|
* cp-demangle.c (d_substitution): Change struct demangle_component
|
||||||
|
variable name from c to dc.
|
||||||
|
|
||||||
|
2016-08-12 Marek Polacek <polacek@redhat.com>
|
||||||
|
|
||||||
|
PR c/7652
|
||||||
|
* cp-demangle.c (d_print_mod): Add FALLTHRU.
|
||||||
|
|
||||||
|
2016-08-04 Marcel Böhme <boehme.marcel@gmail.com>
|
||||||
|
|
||||||
|
PR c++/71696
|
||||||
|
* cplus-dem.c: Prevent infinite recursion when there is a cycle
|
||||||
|
in the referencing of remembered mangled types.
|
||||||
|
(work_stuff): New stack to keep track of the remembered mangled
|
||||||
|
types that are currently being processed.
|
||||||
|
(push_processed_type): New method to push currently processed
|
||||||
|
remembered type onto the stack.
|
||||||
|
(pop_processed_type): New method to pop currently processed
|
||||||
|
remembered type from the stack.
|
||||||
|
(work_stuff_copy_to_from): Copy values of new variables.
|
||||||
|
(delete_non_B_K_work_stuff): Free stack memory.
|
||||||
|
(demangle_args): Push/Pop currently processed remembered type.
|
||||||
|
(do_type): Do not demangle a cyclic reference and push/pop
|
||||||
|
referenced remembered type.
|
||||||
|
|
||||||
2016-07-29 Aldy Hernandez <aldyh@redhat.com>
|
2016-07-29 Aldy Hernandez <aldyh@redhat.com>
|
||||||
|
|
||||||
* make-relative-prefix.c (make_relative_prefix_1): Fall back to
|
* make-relative-prefix.c (make_relative_prefix_1): Fall back to
|
||||||
|
@ -16,7 +52,7 @@
|
||||||
(d_template_args_1): Split out from d_template_args.
|
(d_template_args_1): Split out from d_template_args.
|
||||||
(d_args_length): New.
|
(d_args_length): New.
|
||||||
|
|
||||||
2016-07-13 Marcel BÃhme <boehme.marcel@gmail.com>
|
2016-07-13 Marcel Böhme <boehme.marcel@gmail.com>
|
||||||
|
|
||||||
PR c++/70926
|
PR c++/70926
|
||||||
* cplus-dem.c: Handle large values and overflow when demangling
|
* cplus-dem.c: Handle large values and overflow when demangling
|
||||||
|
@ -143,8 +179,6 @@
|
||||||
|
|
||||||
PR other/61321
|
PR other/61321
|
||||||
PR other/61233
|
PR other/61233
|
||||||
* demangle.h (enum demangle_component_type)
|
|
||||||
<DEMANGLE_COMPONENT_CONVERSION>: New value.
|
|
||||||
* cp-demangle.c (d_demangle_callback, d_make_comp): Handle
|
* cp-demangle.c (d_demangle_callback, d_make_comp): Handle
|
||||||
DEMANGLE_COMPONENT_CONVERSION.
|
DEMANGLE_COMPONENT_CONVERSION.
|
||||||
(is_ctor_dtor_or_conversion): Handle DEMANGLE_COMPONENT_CONVERSION
|
(is_ctor_dtor_or_conversion): Handle DEMANGLE_COMPONENT_CONVERSION
|
||||||
|
@ -739,11 +773,11 @@
|
||||||
2013-05-31 Matt Burgess <matthew@linuxfromscratch.org>
|
2013-05-31 Matt Burgess <matthew@linuxfromscratch.org>
|
||||||
|
|
||||||
PR other/56780
|
PR other/56780
|
||||||
* libiberty/configure.ac: Move test for --enable-install-libiberty
|
* configure.ac: Move test for --enable-install-libiberty
|
||||||
outside of the 'with_target_subdir' test so that it actually gets
|
outside of the 'with_target_subdir' test so that it actually gets
|
||||||
run. Add output messages to show the test result.
|
run. Add output messages to show the test result.
|
||||||
* libiberty/configure: Regenerate.
|
* configure: Regenerate.
|
||||||
* libiberty/Makefile.in (install_to_libdir): Place the
|
* Makefile.in (install_to_libdir): Place the
|
||||||
installation of the libiberty library in the same guard as that
|
installation of the libiberty library in the same guard as that
|
||||||
used for the headers to prevent it being installed unless
|
used for the headers to prevent it being installed unless
|
||||||
requested via --enable-install-libiberty.
|
requested via --enable-install-libiberty.
|
||||||
|
@ -1543,7 +1577,6 @@
|
||||||
Daniel Jacobowitz <dan@codesourcery.com>
|
Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
Pedro Alves <pedro@codesourcery.com>
|
Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
libiberty/
|
|
||||||
* argv.c (consume_whitespace): New function.
|
* argv.c (consume_whitespace): New function.
|
||||||
(only_whitespace): New function.
|
(only_whitespace): New function.
|
||||||
(buildargv): Always use ISSPACE by calling consume_whitespace.
|
(buildargv): Always use ISSPACE by calling consume_whitespace.
|
||||||
|
@ -1744,8 +1777,8 @@
|
||||||
|
|
||||||
2009-04-07 Arnaud Patard <apatard@mandriva.com>
|
2009-04-07 Arnaud Patard <apatard@mandriva.com>
|
||||||
|
|
||||||
* libiberty/configure.ac: Fix Linux/MIPS matching rule.
|
* configure.ac: Fix Linux/MIPS matching rule.
|
||||||
* libiberty/configure: Regenerate.
|
* configure: Regenerate.
|
||||||
|
|
||||||
2009-03-27 Ian Lance Taylor <iant@google.com>
|
2009-03-27 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
|
@ -1908,8 +1941,8 @@
|
||||||
|
|
||||||
2008-04-21 Aurelien Jarno <aurelien@aurel32.net>
|
2008-04-21 Aurelien Jarno <aurelien@aurel32.net>
|
||||||
|
|
||||||
* libiberty/configure.ac: use -fPIC on Linux/MIPS hosts.
|
* configure.ac: use -fPIC on Linux/MIPS hosts.
|
||||||
* libiberty/configure: Regenerate.
|
* configure: Regenerate.
|
||||||
|
|
||||||
2008-04-18 Kris Van Hees <kris.van.hees@oracle.com>
|
2008-04-18 Kris Van Hees <kris.van.hees@oracle.com>
|
||||||
|
|
||||||
|
@ -2115,7 +2148,7 @@
|
||||||
that are locale-independent.
|
that are locale-independent.
|
||||||
* Makefile.in (filename_cmp.o): Add dependency on safe-ctype.h.
|
* Makefile.in (filename_cmp.o): Add dependency on safe-ctype.h.
|
||||||
|
|
||||||
2007-04-11 Thomas Neumann tneumann@users.sourceforge.net
|
2007-04-11 Thomas Neumann <tneumann@users.sourceforge.net>
|
||||||
|
|
||||||
* argv.c: Use ANSI C declarations.
|
* argv.c: Use ANSI C declarations.
|
||||||
* make-relative-prefix.c: Likewise.
|
* make-relative-prefix.c: Likewise.
|
||||||
|
@ -3687,7 +3720,7 @@
|
||||||
|
|
||||||
2003-12-15 Brendan Kehoe <brendan@zen.org>
|
2003-12-15 Brendan Kehoe <brendan@zen.org>
|
||||||
|
|
||||||
* libiberty/Makefile.in (floatformat.o): Add dependency on
|
* Makefile.in (floatformat.o): Add dependency on
|
||||||
config.h to accompany change of 2003-12-03.
|
config.h to accompany change of 2003-12-03.
|
||||||
|
|
||||||
2003-12-15 Ian Lance Taylor <ian@wasabisystems.com>
|
2003-12-15 Ian Lance Taylor <ian@wasabisystems.com>
|
||||||
|
@ -4383,7 +4416,7 @@
|
||||||
|
|
||||||
2002-10-06 Andreas Jaeger <aj@suse.de>
|
2002-10-06 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
* libiberty/cplus-dem.c (ada_demangle): Get rid of unneeded
|
* cplus-dem.c (ada_demangle): Get rid of unneeded
|
||||||
variable and of strict-aliasing warning.
|
variable and of strict-aliasing warning.
|
||||||
(grow_vect): Use char as first parameter.
|
(grow_vect): Use char as first parameter.
|
||||||
|
|
||||||
|
@ -4651,7 +4684,7 @@
|
||||||
|
|
||||||
2002-01-31 Adam Megacz <adam@xwt.org>
|
2002-01-31 Adam Megacz <adam@xwt.org>
|
||||||
|
|
||||||
* gcc/libiberty/configure.in: Treat mingw the same as cywin
|
* configure.in: Treat mingw the same as cywin
|
||||||
wrt HAVE_SYS_ERRLIST.
|
wrt HAVE_SYS_ERRLIST.
|
||||||
|
|
||||||
2002-01-30 Phil Edwards <pme@gcc.gnu.org>
|
2002-01-30 Phil Edwards <pme@gcc.gnu.org>
|
||||||
|
@ -5159,8 +5192,8 @@ Tue Aug 21 12:35:04 2001 Christopher Faylor <cgf@cygnus.com>
|
||||||
2001-03-10 Neil Booth <neil@daikokuya.demon.co.uk>
|
2001-03-10 Neil Booth <neil@daikokuya.demon.co.uk>
|
||||||
John David Anglin <dave@hiauly1.hia.nrc.ca>
|
John David Anglin <dave@hiauly1.hia.nrc.ca>
|
||||||
|
|
||||||
* libiberty/lbasename.c: New file.
|
* lbasename.c: New file.
|
||||||
* libiberty/Makefile.in: Update for lbasename.
|
* Makefile.in: Update for lbasename.
|
||||||
|
|
||||||
2001-03-06 Zack Weinberg <zackw@stanford.edu>
|
2001-03-06 Zack Weinberg <zackw@stanford.edu>
|
||||||
|
|
||||||
|
@ -5533,13 +5566,13 @@ Tue Aug 21 12:35:04 2001 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
2000-08-24 Greg McGary <greg@mcgary.org>
|
2000-08-24 Greg McGary <greg@mcgary.org>
|
||||||
|
|
||||||
* libiberty/random.c (end_ptr): Revert previous change.
|
* random.c (end_ptr): Revert previous change.
|
||||||
|
|
||||||
2000-08-24 Greg McGary <greg@mcgary.org>
|
2000-08-24 Greg McGary <greg@mcgary.org>
|
||||||
|
|
||||||
* libiberty/cplus-dem.c (cplus_demangle_opname, cplus_mangle_opname,
|
* cplus-dem.c (cplus_demangle_opname, cplus_mangle_opname,
|
||||||
demangle_expression, demangle_function_name): Use ARRAY_SIZE.
|
demangle_expression, demangle_function_name): Use ARRAY_SIZE.
|
||||||
* libiberty/random.c (end_ptr): Likewise.
|
* random.c (end_ptr): Likewise.
|
||||||
|
|
||||||
2000-08-23 Alex Samuel <samuel@codesourcery.com>
|
2000-08-23 Alex Samuel <samuel@codesourcery.com>
|
||||||
|
|
||||||
|
|
|
@ -3769,7 +3769,7 @@ d_substitution (struct d_info *di, int prefix)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
int len;
|
int len;
|
||||||
struct demangle_component *c;
|
struct demangle_component *dc;
|
||||||
|
|
||||||
if (p->set_last_name != NULL)
|
if (p->set_last_name != NULL)
|
||||||
di->last_name = d_make_sub (di, p->set_last_name,
|
di->last_name = d_make_sub (di, p->set_last_name,
|
||||||
|
@ -3785,15 +3785,15 @@ d_substitution (struct d_info *di, int prefix)
|
||||||
len = p->simple_len;
|
len = p->simple_len;
|
||||||
}
|
}
|
||||||
di->expansion += len;
|
di->expansion += len;
|
||||||
c = d_make_sub (di, s, len);
|
dc = d_make_sub (di, s, len);
|
||||||
if (d_peek_char (di) == 'B')
|
if (d_peek_char (di) == 'B')
|
||||||
{
|
{
|
||||||
/* If there are ABI tags on the abbreviation, it becomes
|
/* If there are ABI tags on the abbreviation, it becomes
|
||||||
a substitution candidate. */
|
a substitution candidate. */
|
||||||
c = d_abi_tags (di, c);
|
dc = d_abi_tags (di, dc);
|
||||||
d_add_substitution (di, c);
|
d_add_substitution (di, dc);
|
||||||
}
|
}
|
||||||
return c;
|
return dc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5777,11 +5777,13 @@ d_print_mod (struct d_print_info *dpi, int options,
|
||||||
case DEMANGLE_COMPONENT_REFERENCE_THIS:
|
case DEMANGLE_COMPONENT_REFERENCE_THIS:
|
||||||
/* For the ref-qualifier, put a space before the &. */
|
/* For the ref-qualifier, put a space before the &. */
|
||||||
d_append_char (dpi, ' ');
|
d_append_char (dpi, ' ');
|
||||||
|
/* FALLTHRU */
|
||||||
case DEMANGLE_COMPONENT_REFERENCE:
|
case DEMANGLE_COMPONENT_REFERENCE:
|
||||||
d_append_char (dpi, '&');
|
d_append_char (dpi, '&');
|
||||||
return;
|
return;
|
||||||
case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
|
case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
|
||||||
d_append_char (dpi, ' ');
|
d_append_char (dpi, ' ');
|
||||||
|
/* FALLTHRU */
|
||||||
case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
|
case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
|
||||||
d_append_string (dpi, "&&");
|
d_append_string (dpi, "&&");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -144,6 +144,9 @@ struct work_stuff
|
||||||
string* previous_argument; /* The last function argument demangled. */
|
string* previous_argument; /* The last function argument demangled. */
|
||||||
int nrepeats; /* The number of times to repeat the previous
|
int nrepeats; /* The number of times to repeat the previous
|
||||||
argument. */
|
argument. */
|
||||||
|
int *proctypevec; /* Indices of currently processed remembered typevecs. */
|
||||||
|
int proctypevec_size;
|
||||||
|
int nproctypes;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define PRINT_ANSI_QUALIFIERS (work -> options & DMGL_ANSI)
|
#define PRINT_ANSI_QUALIFIERS (work -> options & DMGL_ANSI)
|
||||||
|
@ -436,6 +439,10 @@ iterate_demangle_function (struct work_stuff *,
|
||||||
|
|
||||||
static void remember_type (struct work_stuff *, const char *, int);
|
static void remember_type (struct work_stuff *, const char *, int);
|
||||||
|
|
||||||
|
static void push_processed_type (struct work_stuff *, int);
|
||||||
|
|
||||||
|
static void pop_processed_type (struct work_stuff *);
|
||||||
|
|
||||||
static void remember_Btype (struct work_stuff *, const char *, int, int);
|
static void remember_Btype (struct work_stuff *, const char *, int, int);
|
||||||
|
|
||||||
static int register_Btype (struct work_stuff *);
|
static int register_Btype (struct work_stuff *);
|
||||||
|
@ -1302,6 +1309,10 @@ work_stuff_copy_to_from (struct work_stuff *to, struct work_stuff *from)
|
||||||
memcpy (to->btypevec[i], from->btypevec[i], len);
|
memcpy (to->btypevec[i], from->btypevec[i], len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (from->proctypevec)
|
||||||
|
to->proctypevec =
|
||||||
|
XDUPVEC (int, from->proctypevec, from->proctypevec_size);
|
||||||
|
|
||||||
if (from->ntmpl_args)
|
if (from->ntmpl_args)
|
||||||
to->tmpl_argvec = XNEWVEC (char *, from->ntmpl_args);
|
to->tmpl_argvec = XNEWVEC (char *, from->ntmpl_args);
|
||||||
|
|
||||||
|
@ -1330,11 +1341,17 @@ delete_non_B_K_work_stuff (struct work_stuff *work)
|
||||||
/* Discard the remembered types, if any. */
|
/* Discard the remembered types, if any. */
|
||||||
|
|
||||||
forget_types (work);
|
forget_types (work);
|
||||||
if (work -> typevec != NULL)
|
if (work->typevec != NULL)
|
||||||
{
|
{
|
||||||
free ((char *) work -> typevec);
|
free ((char *) work->typevec);
|
||||||
work -> typevec = NULL;
|
work->typevec = NULL;
|
||||||
work -> typevec_size = 0;
|
work->typevec_size = 0;
|
||||||
|
}
|
||||||
|
if (work->proctypevec != NULL)
|
||||||
|
{
|
||||||
|
free (work->proctypevec);
|
||||||
|
work->proctypevec = NULL;
|
||||||
|
work->proctypevec_size = 0;
|
||||||
}
|
}
|
||||||
if (work->tmpl_argvec)
|
if (work->tmpl_argvec)
|
||||||
{
|
{
|
||||||
|
@ -3555,6 +3572,8 @@ static int
|
||||||
do_type (struct work_stuff *work, const char **mangled, string *result)
|
do_type (struct work_stuff *work, const char **mangled, string *result)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
int i;
|
||||||
|
int is_proctypevec;
|
||||||
int done;
|
int done;
|
||||||
int success;
|
int success;
|
||||||
string decl;
|
string decl;
|
||||||
|
@ -3567,6 +3586,7 @@ do_type (struct work_stuff *work, const char **mangled, string *result)
|
||||||
|
|
||||||
done = 0;
|
done = 0;
|
||||||
success = 1;
|
success = 1;
|
||||||
|
is_proctypevec = 0;
|
||||||
while (success && !done)
|
while (success && !done)
|
||||||
{
|
{
|
||||||
int member;
|
int member;
|
||||||
|
@ -3627,8 +3647,15 @@ do_type (struct work_stuff *work, const char **mangled, string *result)
|
||||||
success = 0;
|
success = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
for (i = 0; i < work->nproctypes; i++)
|
||||||
remembered_type = work -> typevec[n];
|
if (work -> proctypevec [i] == n)
|
||||||
|
success = 0;
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
is_proctypevec = 1;
|
||||||
|
push_processed_type (work, n);
|
||||||
|
remembered_type = work->typevec[n];
|
||||||
mangled = &remembered_type;
|
mangled = &remembered_type;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -3850,6 +3877,9 @@ do_type (struct work_stuff *work, const char **mangled, string *result)
|
||||||
string_delete (result);
|
string_delete (result);
|
||||||
string_delete (&decl);
|
string_delete (&decl);
|
||||||
|
|
||||||
|
if (is_proctypevec)
|
||||||
|
pop_processed_type (work);
|
||||||
|
|
||||||
if (success)
|
if (success)
|
||||||
/* Assume an integral type, if we're not sure. */
|
/* Assume an integral type, if we're not sure. */
|
||||||
return (int) ((tk == tk_none) ? tk_integral : tk);
|
return (int) ((tk == tk_none) ? tk_integral : tk);
|
||||||
|
@ -4262,6 +4292,41 @@ do_arg (struct work_stuff *work, const char **mangled, string *result)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
push_processed_type (struct work_stuff *work, int typevec_index)
|
||||||
|
{
|
||||||
|
if (work->nproctypes >= work->proctypevec_size)
|
||||||
|
{
|
||||||
|
if (!work->proctypevec_size)
|
||||||
|
{
|
||||||
|
work->proctypevec_size = 4;
|
||||||
|
work->proctypevec = XNEWVEC (int, work->proctypevec_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (work->proctypevec_size < 16)
|
||||||
|
/* Double when small. */
|
||||||
|
work->proctypevec_size *= 2;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Grow slower when large. */
|
||||||
|
if (work->proctypevec_size > (INT_MAX / 3) * 2)
|
||||||
|
xmalloc_failed (INT_MAX);
|
||||||
|
work->proctypevec_size = (work->proctypevec_size * 3 / 2);
|
||||||
|
}
|
||||||
|
work->proctypevec
|
||||||
|
= XRESIZEVEC (int, work->proctypevec, work->proctypevec_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
work->proctypevec [work->nproctypes++] = typevec_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pop_processed_type (struct work_stuff *work)
|
||||||
|
{
|
||||||
|
work->nproctypes--;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remember_type (struct work_stuff *work, const char *start, int len)
|
remember_type (struct work_stuff *work, const char *start, int len)
|
||||||
{
|
{
|
||||||
|
@ -4526,10 +4591,13 @@ demangle_args (struct work_stuff *work, const char **mangled,
|
||||||
{
|
{
|
||||||
string_append (declp, ", ");
|
string_append (declp, ", ");
|
||||||
}
|
}
|
||||||
|
push_processed_type (work, t);
|
||||||
if (!do_arg (work, &tem, &arg))
|
if (!do_arg (work, &tem, &arg))
|
||||||
{
|
{
|
||||||
|
pop_processed_type (work);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
pop_processed_type (work);
|
||||||
if (PRINT_ARG_TYPES)
|
if (PRINT_ARG_TYPES)
|
||||||
{
|
{
|
||||||
string_appends (declp, &arg);
|
string_appends (declp, &arg);
|
||||||
|
|
|
@ -370,6 +370,8 @@ argv_to_cmdline (char *const *argv)
|
||||||
cmdline_len++;
|
cmdline_len++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (j == 0)
|
||||||
|
needs_quotes = 1;
|
||||||
/* Trailing backslashes also need to be escaped because they will be
|
/* Trailing backslashes also need to be escaped because they will be
|
||||||
followed by the terminating quote. */
|
followed by the terminating quote. */
|
||||||
if (needs_quotes)
|
if (needs_quotes)
|
||||||
|
@ -394,6 +396,8 @@ argv_to_cmdline (char *const *argv)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (j == 0)
|
||||||
|
needs_quotes = 1;
|
||||||
|
|
||||||
if (needs_quotes)
|
if (needs_quotes)
|
||||||
{
|
{
|
||||||
|
|
|
@ -285,6 +285,20 @@ main (int argc, char **argv)
|
||||||
ERROR ("echo exit status failed");
|
ERROR ("echo exit status failed");
|
||||||
pex_free (pex1);
|
pex_free (pex1);
|
||||||
|
|
||||||
|
/* Check empty parameters don't get lost. */
|
||||||
|
pex1 = TEST_PEX_INIT (PEX_USE_PIPES, "temp");
|
||||||
|
subargv[1] = "echo";
|
||||||
|
subargv[2] = "foo";
|
||||||
|
subargv[3] = "";
|
||||||
|
subargv[4] = "bar";
|
||||||
|
subargv[5] = NULL;
|
||||||
|
TEST_PEX_RUN (pex1, 0, "./test-pexecute", subargv, NULL, NULL);
|
||||||
|
e = TEST_PEX_READ_OUTPUT (pex1);
|
||||||
|
CHECK_LINE (e, "foo bar"); /* Two spaces! */
|
||||||
|
if (TEST_PEX_GET_STATUS_1 (pex1) != 0)
|
||||||
|
ERROR ("echo exit status failed");
|
||||||
|
pex_free (pex1);
|
||||||
|
|
||||||
pex1 = TEST_PEX_INIT (PEX_USE_PIPES, "temp");
|
pex1 = TEST_PEX_INIT (PEX_USE_PIPES, "temp");
|
||||||
subargv[1] = "echo";
|
subargv[1] = "echo";
|
||||||
subargv[2] = "bar";
|
subargv[2] = "bar";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue