В общем, очень * очень плохая идея использовать system
вот так.system
запускает команду через оболочку , что означает, что строка, передаваемая в system
, зависит от всех переменных оболочки, расширения команд, интерпретации специальных символов и т. Д.
Если вы настаиваете на использовании system
, вы должны сначала очистить вашу строку.Самый простой способ сделать это:
char *tmp = malloc(4*strlen(S)+3);
tmp[0] = '\'';
for (i=0,j=1; tmp[j]=S[i]; i++, j++)
if (S[i]=='\'') tmp[++j]='\\', tmp[++j]='\'', tmp[++j]='\'';
tmp[j++] = '\'';
tmp[j++] = 0;
if (snprintf(cmd, sizeof cmd, "foo %s ...", tmp) >= sizeof cmd) goto error;
system(cmd);
Этот код заключает в кавычки всю строку S
и заменяет любые встроенные одинарные кавычки на '\''
.Обратите внимание, что я также проверил усечение командной строки на случай, если это может привести к выполнению опасных команд.
Лучшая альтернатива - полностью отказаться от system
и выполнить свои собственные fork
и exec
для обходаоболочкаТогда нет командной строки для интерпретации;у вас есть полный контроль над аргументами (*argv[]
массив), которые передаются внешней программе.