如何getenv(REQUEST_METHOD)没有ERROR 500

时间:2012-09-20 09:19:30

标签: html c gdb cgi

我正在使用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文件。

2 个答案:

答案 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);