Merge pull request #471 from mikkeloscar/fix-exec-quotes

Add quotes to multiword arguments.
This commit is contained in:
Drew DeVault 2016-01-24 18:33:06 -05:00
commit 55ac868898
3 changed files with 33 additions and 0 deletions

View file

@ -273,6 +273,32 @@ char *join_args(char **argv, int argc) {
return res;
}
static bool has_whitespace(const char *str) {
while (*str) {
if (isspace(*str)) {
return true;
}
++str;
}
return false;
}
/**
* Add quotes around any argv with whitespaces.
*/
void add_quotes(char **argv, int argc) {
int i;
for (i = 0; i < argc; ++i) {
if (has_whitespace(argv[i])) {
int len = strlen(argv[i]) + 3;
char *tmp = argv[i];
argv[i] = malloc(len * sizeof(char));
snprintf(argv[i], len, "\"%s\"", tmp);
free(tmp);
}
}
}
/*
* Join a list of strings, adding separator in between. Separator can be NULL.
*/

View file

@ -31,6 +31,11 @@ int unescape_string(char *string);
char *join_args(char **argv, int argc);
char *join_list(list_t *list, char *separator);
/**
* Add quotes around any argv with whitespaces.
*/
void add_quotes(char **argv, int argc);
// split string into 2 by delim.
char *cmdsep(char **stringp, const char *delim);
// Split string into 2 by delim, handle quotes

View file

@ -361,8 +361,10 @@ static struct cmd_results *cmd_exec_always(int argc, char **argv) {
return error;
}
add_quotes(argv + 1, argc - 1);
tmp = join_args(argv + 1, argc - 1);
} else {
add_quotes(argv, argc);
tmp = join_args(argv, argc);
}