【发布时间】:2017-04-28 15:21:15
【问题描述】:
我正在创建一个函数,它将目录路径作为参数传递,或者如果它留空,则提示用户输入。
我已设置我的PATH_MAX=100 和if 语句来检查if ((strlen(folder path) + strlen(file path)) > PATH_MAX) 会要求用户再次输入。
但是,当我检查所有条件是否有效(设置PATH_MAX=20)时,如果folder path 本身超过PATH_MAX,缓冲区会由于大小不足而崩溃(L'Buffer is too small' &&0)。
有没有办法预先检查用户是否超过PATH_MAX并告知路径太长,以避免崩溃缓冲区?还是我应该只增加PATH_MAX 的大小?
代码:
#define PATH_MAX 100
void CreateFiles(char folder[PATH_MAX])
{
char addrbook[PATH_MAX] = "caf-sorted.txt";
char path[PATH_MAX]="";
if ((strlen(folder)<4))
{
//User inputs directory
printf("Enter New Directory\n(!Do not enter filename!)\n");
if (NULL == fgets(path, sizeof path, stdin))
{//check if fgets fails
if (ferror(stdin))
{
folder="";
perror("fgets() failed");
CreateFiles(folder);
return;
}
}
}
else
memcpy(path, folder, strlen(folder));
path[strcspn(path, "\n\r")] = 0;
if (strlen(addrbook) > 0 && '\\' != path[strlen(path) - 1])
{
if (PATH_MAX < strlen(path))
{
errno = EINVAL;
perror("'path' too long");
folder="";
CreateFiles(folder);
return;
}
strcat(path, "\\");
}
if (PATH_MAX < (strlen(path) + strlen(addrbook)))
{
errno = EINVAL;
perror("'path\\filename' too long");
folder="";
CreateFiles(folder);
return;
}
}
【问题讨论】:
-
你应该在你得到它的地方检查它。
-
即使使用
CreateFiles(char folder[PATH_MAX]),folder也可以指向比MAX_PATH更长的字符串——这可能会失败memcpy(path, folder, strlen(folder));。 -
folder在传入CreateFiles,if (folder>PATH_MAX){folder="";}之前正在检查主目录 -
path[strlen(path) - 1]是一个可利用的 hack,因为strlen(path)不能保证大于 0。 -
if (folder>PATH_MAX)将指针与整数进行比较 - 也许您的意思是其他一些测试? IAC,最好CreateFiles()独立存在,如果传入长字符串的指针也不会失败。