所以基本上我给了一个目录路径,如果它存在则返回index.html
或者如果该文件存在则返回index.php
。问题是我不知道如何调试这个函数,因为我只是为一个更大的程序实现了这个函数。
char *indexes(const char *path) {
char *newPath = malloc(sizeof(char) * strlen(path));
strcpy(newPath, path);
if (access(path, F_OK)) {
if (access("index.html", F_OK)) {
strcat(newPath, "/index.html");
} else
if (access("index.php", F_OK)) {
strcat(newPath, "/index.php");
} else {
return NULL;
}
} else {
return NULL;
}
return newPath;
}
这看起来是否正确?当我运行我的程序时,我收到错误501 Not Implemented
答案 0 :(得分:2)
由于您要将path
和/index.html
连接到新分配的newPath
,因此必须将其分配给至少长度之和加上空终止符的1个额外字节:
strlen(path) + strlen("/index.html") + 1;
"/index.php"
比其他字符串短,因此缓冲区可以处理备用连接。
当前代码导致缓冲区溢出,调用未定义的行为,可能导致观察到的行为。
请注意,您的代码无法按原样运行:您应该在检查访问权限之前进行连接,否则您将检查错误目录中的访问权限。如果找不到索引文件,您还应该free(newPath);
。
以下是更正后的版本:
char *indexes(const char *path) {
char *newPath = malloc(strlen(path) + strlen("/index.html") + 1);
if (newPath) {
strcpy(newPath, path);
strcat(newPath, "/index.html");
if (access(newPath, F_OK)) {
return newPath;
}
strcpy(newPath, path);
strcat(newPath, "/index.php");
if (access(newPath, F_OK)) {
return newPath;
}
free(newPath);
}
return NULL;
}