我正在使用C来处理CGI文件,只有在请求方法是POST时才会执行操作。
int main(void)
{
char *method_str = getenv("REQUEST_METHOD");
int iMethod = strcmp(method_str,"POST");
int tid = 0;
int own_id = 0;
char key[16] = "\0";
if (iMethod == -1) {
puts("Location:start.cgi\n\n");
} else if (iMethod == 0) {
char *data = getenv("CONTENT_LENGTH");
int size = atoi(data);
char *buffer = malloc((size+1)*sizeof(char));
fgets(buffer,atoi(data)+1,stdin);
int counter = count(buffer);
char **names = malloc(counter*sizeof(char *));
char **values = malloc(counter*sizeof(char *));
parse(buffer, names, values);
int isDel = strcmp(*(values+1),"Back to Start");
if (isDel == 0) startpage(atoi(*values));
else {
own_id = atoi(*values);
sprintf(key,"%s",*(values+1));
int stat = login_status(own_id,key);
if (stat == -1) {
startpage(0);
} else userpage(own_id);
}
free_mallocs(names,values,counter);
free(buffer);
}
free(method_str);
return 0;
}
在gdb中运行CGI文件告诉我问题在于:
int iMethod = strcmp(method_str,"POST");
。错误是SIGSEGV。
当我从XAMPP服务器打开它时,CGI运行正常。但是,当我在与我不同的Ubuntu服务器中运行它时,会发生错误500。我尝试将getenv("REQUEST_METHOD")
的值与NULL进行比较,gdb告诉我该文件正常运行。但是,CGI文件无法在我的XAMPP服务器和另一台服务器上正常运行,两者显示错误500。
我可以告诉你的是,这些函数设置了内容标题。函数count()和parse()被适当地设置并且与手头的情况无关。
提前谢谢。
更新:如果用户直接打开CGI文件,浏览器将重定向到另一个CGI文件。
答案 0 :(得分:1)
我不确定您要求的完全,但如果环境变量不存在,则getenv()
会返回NULL
。取消引用NULL
指针是未定义的行为,传递给strcmp()
的指针将被取消引用。将NULL
作为参数传递给strcmp()
是因此未定义的行为,这可能是分段错误(这可能是原因)。通过对strcmp()
进行NULL
检查,保护对method_str
的来电。
为什么环境变量不存在我不知道。
答案 1 :(得分:0)
strcmp
时, NULL
会出现段错误。检查NULL
,你没问题:
char *method_str = getenv("REQUEST_METHOD");
int iMethod = -1;
if (method_str != NULL)
iMethod = strcmp(method_str,"POST");
}
作为额外内容,请尽量避免strcmp
并始终使用strncmp
,因为它更安全:
strncmp(method_str, "POST", 4);