Make sure program names are encoded before using them to invoke subprocesses.

src/callproc.c (Fcall_process): Make sure program name in PATH and
 new_argv[0] is encoded, if needed.  Otherwise, un-encoded string
 is passed to exec/spawnve, which fails unless the file-name
 encoding is UTF-8.
This commit is contained in:
Eli Zaretskii 2013-02-01 12:15:36 +02:00
parent 18a80473ed
commit e7c3fb0624
2 changed files with 32 additions and 21 deletions

View file

@ -1,5 +1,10 @@
2013-02-01 Eli Zaretskii <eliz@gnu.org>
* callproc.c (Fcall_process): Make sure program name in PATH and
new_argv[0] is encoded, if needed. Otherwise, un-encoded string
is passed to exec/spawnve, which fails unless the file-name
encoding is UTF-8.
* w32proc.c (sys_spawnve): Make sure escape_char is initialized,
even if w32-quote-process-args is nil.

View file

@ -416,28 +416,34 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
path = Fsubstring (path, make_number (2), Qnil);
new_argv = SAFE_ALLOCA ((nargs > 4 ? nargs - 2 : 2) * sizeof *new_argv);
if (nargs > 4)
{
ptrdiff_t i;
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
GCPRO5 (infile, buffer, current_dir, path, error_file);
argument_coding.dst_multibyte = 0;
for (i = 4; i < nargs; i++)
{
argument_coding.src_multibyte = STRING_MULTIBYTE (args[i]);
if (CODING_REQUIRE_ENCODING (&argument_coding))
/* We must encode this argument. */
args[i] = encode_coding_string (&argument_coding, args[i], 1);
}
UNGCPRO;
for (i = 4; i < nargs; i++)
new_argv[i - 3] = SDATA (args[i]);
new_argv[i - 3] = 0;
}
else
new_argv[1] = 0;
new_argv[0] = SDATA (path);
{
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
GCPRO5 (infile, buffer, current_dir, path, error_file);
if (nargs > 4)
{
ptrdiff_t i;
argument_coding.dst_multibyte = 0;
for (i = 4; i < nargs; i++)
{
argument_coding.src_multibyte = STRING_MULTIBYTE (args[i]);
if (CODING_REQUIRE_ENCODING (&argument_coding))
/* We must encode this argument. */
args[i] = encode_coding_string (&argument_coding, args[i], 1);
}
for (i = 4; i < nargs; i++)
new_argv[i - 3] = SDATA (args[i]);
new_argv[i - 3] = 0;
}
else
new_argv[1] = 0;
if (STRING_MULTIBYTE (path))
path = ENCODE_FILE (path);
new_argv[0] = SDATA (path);
UNGCPRO;
}
#ifdef MSDOS /* MW, July 1993 */