diff options
author | Eli Zaretskii <eliz@gnu.org> | 2013-02-01 12:15:36 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2013-02-01 12:15:36 +0200 |
commit | e7c3fb0624a88210f3a95adb103eba274b0fdba7 (patch) | |
tree | 28687fc2f236f4d4a369ebe8376892d3c69ff241 /src/callproc.c | |
parent | 18a80473ed3fd815d99e64a8e7392066125a7e3c (diff) | |
download | emacs-e7c3fb0624a88210f3a95adb103eba274b0fdba7.tar.gz emacs-e7c3fb0624a88210f3a95adb103eba274b0fdba7.tar.bz2 emacs-e7c3fb0624a88210f3a95adb103eba274b0fdba7.zip |
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.
Diffstat (limited to 'src/callproc.c')
-rw-r--r-- | src/callproc.c | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/src/callproc.c b/src/callproc.c index d152da19f7b..c4177d5044c 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -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 */ |