1
在我的C程序中,我使用execvp命令來解析輸入並運行它。 我有這樣的:execvp導致內存問題
char read_str[MAX_ALLOWED_BUFFER];
pid_t child_pid;
char *strs[100] = {NULL};
child_pid = fork();
if (child_pid == 0) {
split(read_str, strs);
execvp(strs[0], strs);
printf("Failed\n");
}
else {
waitpid(child_pid, NULL, 0);
for (y = 0; y < 100; y++) free(strs[y]);
}
和該功能
void split(char *str, char **splitstr) {
char *p;
int i=0;
p = strtok(str," ");
while(p!= NULL) {
splitstr[i] = malloc(strlen(p) + 1);
if (splitstr[i]) strcpy(splitstr[i], p);
i++;
p = strtok(NULL, " ");
}
}
第一碼塊是在while循環和不斷要求用戶輸入。無論如何,如果execvp返回,然後出現錯誤,它打印失敗,然後如果我鍵入兩個更有效的命令,我得到一個內存損壞錯誤...
有沒有人看到我在做什麼錯在這裏?
*「我使用execvp命令來解析輸入並運行它。」*以這種方式使用未經過濾的用戶輸入是一個令人難以置信的糟糕主意。如果我將您的程序'rm -rf〜/'或將Little Bobby Tables的名稱傳遞給您的大型生產數據庫,該怎麼辦? – dmckee
假設正在構建的程序是一個外殼,看起來是這樣的:外殼應該這樣做。這點很重要。除非有一些更大的上下文表明來自** untrusted **用戶的輸入涉及,否則不要在這裏假設安全問題。 – duskwuff