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:
parent
18a80473ed
commit
e7c3fb0624
2 changed files with 32 additions and 21 deletions
|
@ -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.
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue