2

我正在使用 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。我可以告诉您的是,这些函数设置了它们的 Content 标头。函数 count() 和 parse() 被适当地设置并且独立于手头的情况。提前致谢。

更新:如果用户直接打开 CGI 文件,浏览器将重定向到另一个 CGI 文件。

4

2 回答 2

1

我不确定您到底在问什么,但如果环境变量不存在则getenv()返回。NULL取消引用NULL指针是未定义的行为,传递给的指针strcmp()将被取消引用。NULL作为参数传递给strcmp()是因此未定义的行为,这可能是分段错误(并且是这里的可能原因)。strcmp()通过NULL选中来保护对 的调用method_str

为什么环境变量不存在我不知道。

于 2012-09-20T09:29:16.257 回答
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);
于 2012-09-20T09:28:51.503 回答