wrappers: Consistently quote all arguments when calling spawn or creating a command line

This commit is contained in:
Martin Storsjö committed 2019-05-06 11:04:53 +03:00
1 parent fa88c4ee1e
commit 750ab50433
3 files changed
+39 -29

No files matched your search

+5 -4
View File
@@ -75,12 +75,13 @@ static void filter_stderr(char *buf, int n) {
} }
static int exec_filtered(const TCHAR **argv) { static int exec_filtered(const TCHAR **argv) {
for (int i = 0; argv[i]; i++)
argv[i] = escape(argv[i]);
int len = 1; int len = 1;
for (int i = 0; argv[i]; i++) for (int i = 0; argv[i]; i++)
len += _tcslen(argv[i]) + 1; len += _tcslen(argv[i]) + 1;
TCHAR *cmdline = malloc(len * sizeof(*cmdline)); TCHAR *cmdline = malloc(len * sizeof(*cmdline));
int pos = 0; int pos = 0;
// On Windows, the arguments are already quoted and escaped properly.
for (int i = 0; argv[i]; i++) { for (int i = 0; argv[i]; i++) {
_tcscpy(&cmdline[pos], argv[i]); _tcscpy(&cmdline[pos], argv[i]);
pos += _tcslen(argv[i]); pos += _tcslen(argv[i]);
@@ -165,7 +166,7 @@ int _tmain(int argc, TCHAR* argv[]) {
int arg = 0; int arg = 0;
if (getenv("CCACHE")) if (getenv("CCACHE"))
exec_argv[arg++] = _T("ccache"); exec_argv[arg++] = _T("ccache");
exec_argv[arg++] = escape(concat(dir, _T(CLANG))); exec_argv[arg++] = concat(dir, _T(CLANG));
// If changing this wrapper, change clang-target-wrapper.sh accordingly. // If changing this wrapper, change clang-target-wrapper.sh accordingly.
if (!_tcscmp(exe, _T("clang++")) || !_tcscmp(exe, _T("g++")) || !_tcscmp(exe, _T("c++"))) if (!_tcscmp(exe, _T("clang++")) || !_tcscmp(exe, _T("g++")) || !_tcscmp(exe, _T("c++")))
@@ -204,7 +205,7 @@ int _tmain(int argc, TCHAR* argv[]) {
exec_argv[arg++] = _T("-Qunused-arguments"); exec_argv[arg++] = _T("-Qunused-arguments");
for (int i = 1; i < argc; i++) for (int i = 1; i < argc; i++)
exec_argv[arg++] = escape(argv[i]); exec_argv[arg++] = argv[i];
exec_argv[arg] = NULL; exec_argv[arg] = NULL;
if (arg > max_arg) { if (arg > max_arg) {
@@ -222,7 +223,7 @@ int _tmain(int argc, TCHAR* argv[]) {
if (!_tcscmp(argv[i], _T("-v"))) if (!_tcscmp(argv[i], _T("-v")))
return exec_filtered(exec_argv); return exec_filtered(exec_argv);
int ret = _tspawnvp(_P_WAIT, exec_argv[0], exec_argv); int ret = _tspawnvp_escape(_P_WAIT, exec_argv[0], exec_argv);
if (ret == -1) { if (ret == -1) {
_tperror(exec_argv[0]); _tperror(exec_argv[0]);
return 1; return 1;
+13 -4
View File
@@ -56,8 +56,8 @@ typedef char TCHAR;
#define TS "%s" #define TS "%s"
#endif #endif
static TCHAR *escape(const TCHAR *str) {
#ifdef _WIN32 #ifdef _WIN32
static TCHAR *escape(const TCHAR *str) {
TCHAR *out = malloc((_tcslen(str) * 2 + 3) * sizeof(*out)); TCHAR *out = malloc((_tcslen(str) * 2 + 3) * sizeof(*out));
TCHAR *ptr = out; TCHAR *ptr = out;
int i; int i;
@@ -82,11 +82,20 @@ static TCHAR *escape(const TCHAR *str) {
*ptr++ = '"'; *ptr++ = '"';
*ptr++ = '\0'; *ptr++ = '\0';
return out; return out;
#else
return _tcsdup(str);
#endif
} }
static int _tspawnvp_escape(int mode, const TCHAR *filename, const TCHAR * const *argv) {
int num_args = 0;
while (argv[num_args])
num_args++;
const TCHAR **escaped_argv = malloc(num_args * sizeof(*escaped_argv));
for (int i = 0; argv[i]; i++)
escaped_argv[i] = escape(argv[i]);
escaped_argv[num_args] = NULL;
return _tspawnvp(mode, filename, escaped_argv);
}
#endif
static TCHAR *concat(const TCHAR *prefix, const TCHAR *suffix) { static TCHAR *concat(const TCHAR *prefix, const TCHAR *suffix) {
int prefixlen = _tcslen(prefix); int prefixlen = _tcslen(prefix);
int suffixlen = _tcslen(suffix); int suffixlen = _tcslen(suffix);
+21 -21
View File
@@ -37,7 +37,7 @@
#ifdef _WIN32 #ifdef _WIN32
#else #else
#define _tspawnvp _spawnvp #define _tspawnvp_escape _spawnvp
#include <sys/wait.h> #include <sys/wait.h>
#include <errno.h> #include <errno.h>
@@ -287,21 +287,21 @@ int _tmain(int argc, TCHAR* argv[]) {
int arg = 0; int arg = 0;
if (!_tcscmp(input_format, _T("rc"))) { if (!_tcscmp(input_format, _T("rc"))) {
exec_argv[arg++] = escape(concat(dir, CC)); exec_argv[arg++] = concat(dir, CC);
exec_argv[arg++] = _T("-E"); exec_argv[arg++] = _T("-E");
for (int i = 0; i < nb_cpp_options; i++) for (int i = 0; i < nb_cpp_options; i++)
exec_argv[arg++] = escape(cpp_options[i]); exec_argv[arg++] = cpp_options[i];
exec_argv[arg++] = _T("-xc"); exec_argv[arg++] = _T("-xc");
exec_argv[arg++] = _T("-DRC_INVOKED=1"); exec_argv[arg++] = _T("-DRC_INVOKED=1");
exec_argv[arg++] = escape(input); exec_argv[arg++] = input;
exec_argv[arg++] = _T("-o"); exec_argv[arg++] = _T("-o");
exec_argv[arg++] = escape(preproc_rc); exec_argv[arg++] = preproc_rc;
exec_argv[arg] = NULL; exec_argv[arg] = NULL;
check_num_args(arg, max_arg); check_num_args(arg, max_arg);
if (verbose) if (verbose)
print_argv(exec_argv); print_argv(exec_argv);
int ret = _tspawnvp(_P_WAIT, exec_argv[0], exec_argv); int ret = _tspawnvp_escape(_P_WAIT, exec_argv[0], exec_argv);
if (ret == -1) { if (ret == -1) {
_tperror(exec_argv[0]); _tperror(exec_argv[0]);
return 1; return 1;
@@ -312,25 +312,25 @@ int _tmain(int argc, TCHAR* argv[]) {
} }
arg = 0; arg = 0;
exec_argv[arg++] = escape(concat(dir, _T("llvm-rc"))); exec_argv[arg++] = concat(dir, _T("llvm-rc"));
for (int i = 0; i < nb_rc_options; i++) for (int i = 0; i < nb_rc_options; i++)
exec_argv[arg++] = escape(rc_options[i]); exec_argv[arg++] = rc_options[i];
exec_argv[arg++] = _T("-I"); exec_argv[arg++] = _T("-I");
exec_argv[arg++] = escape(inputdir); exec_argv[arg++] = inputdir;
exec_argv[arg++] = escape(preproc_rc); exec_argv[arg++] = preproc_rc;
exec_argv[arg++] = _T("-c"); exec_argv[arg++] = _T("-c");
exec_argv[arg++] = codepage; exec_argv[arg++] = codepage;
exec_argv[arg++] = _T("-fo"); exec_argv[arg++] = _T("-fo");
if (!_tcscmp(output_format, _T("res"))) if (!_tcscmp(output_format, _T("res")))
exec_argv[arg++] = escape(output); exec_argv[arg++] = output;
else else
exec_argv[arg++] = escape(res); exec_argv[arg++] = res;
exec_argv[arg] = NULL; exec_argv[arg] = NULL;
check_num_args(arg, max_arg); check_num_args(arg, max_arg);
if (verbose) if (verbose)
print_argv(exec_argv); print_argv(exec_argv);
ret = _tspawnvp(_P_WAIT, exec_argv[0], exec_argv); ret = _tspawnvp_escape(_P_WAIT, exec_argv[0], exec_argv);
if (ret == -1) { if (ret == -1) {
_tperror(exec_argv[0]); _tperror(exec_argv[0]);
return 1; return 1;
@@ -346,16 +346,16 @@ int _tmain(int argc, TCHAR* argv[]) {
// All done // All done
} else if (!_tcscmp(output_format, _T("coff"))) { } else if (!_tcscmp(output_format, _T("coff"))) {
arg = 0; arg = 0;
exec_argv[arg++] = escape(concat(dir, _T("llvm-cvtres"))); exec_argv[arg++] = concat(dir, _T("llvm-cvtres"));
exec_argv[arg++] = escape(res); exec_argv[arg++] = res;
exec_argv[arg++] = concat(_T("-machine:"), machine); exec_argv[arg++] = concat(_T("-machine:"), machine);
exec_argv[arg++] = escape(concat(_T("-out:"), output)); exec_argv[arg++] = concat(_T("-out:"), output);
exec_argv[arg] = NULL; exec_argv[arg] = NULL;
check_num_args(arg, max_arg); check_num_args(arg, max_arg);
if (verbose) if (verbose)
print_argv(exec_argv); print_argv(exec_argv);
int ret = _tspawnvp(_P_WAIT, exec_argv[0], exec_argv); int ret = _tspawnvp_escape(_P_WAIT, exec_argv[0], exec_argv);
if (ret == -1) { if (ret == -1) {
_tperror(exec_argv[0]); _tperror(exec_argv[0]);
return 1; return 1;
@@ -369,16 +369,16 @@ int _tmain(int argc, TCHAR* argv[]) {
error(basename, _T("invalid output format: `"TS"'"), output_format); error(basename, _T("invalid output format: `"TS"'"), output_format);
} }
} else if (!_tcscmp(input_format, _T("res"))) { } else if (!_tcscmp(input_format, _T("res"))) {
exec_argv[arg++] = escape(concat(dir, _T("llvm-cvtres"))); exec_argv[arg++] = concat(dir, _T("llvm-cvtres"));
exec_argv[arg++] = escape(input); exec_argv[arg++] = input;
exec_argv[arg++] = concat(_T("-machine:"), machine); exec_argv[arg++] = concat(_T("-machine:"), machine);
exec_argv[arg++] = escape(concat(_T("-out:"), output)); exec_argv[arg++] = concat(_T("-out:"), output);
exec_argv[arg] = NULL; exec_argv[arg] = NULL;
check_num_args(arg, max_arg); check_num_args(arg, max_arg);
if (verbose) if (verbose)
print_argv(exec_argv); print_argv(exec_argv);
int ret = _tspawnvp(_P_WAIT, exec_argv[0], exec_argv); int ret = _tspawnvp_escape(_P_WAIT, exec_argv[0], exec_argv);
if (ret == -1) { if (ret == -1) {
_tperror(exec_argv[0]); _tperror(exec_argv[0]);
return 1; return 1;