2

リクエストメソッドがPOSTの場合にのみ処理を行うCを使用してCGIファイルで作業しています。

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を開くと、CGIは正常に動作します。ただし、自分とは別のUbuntuサーバーで実行すると、エラー500が発生します。の値をNULLと比較しようとしましたがgetenv("REQUEST_METHOD")、gdbはファイルが正常に実行されたことを示しています。ただし、CGIファイルはXAMPPサーバーと他のサーバーの両方で正しく実行できず、2つはエラー500を示しています。関数にContentヘッダーが設定されていることがわかります。関数count()とparse()は適切に設定されており、目前の状況とは無関係です。前もって感謝します。

更新:ユーザーがCGIファイルを直接開くと、ブラウザーは別のCGIファイルにリダイレクトします。

4

2 に答える 2

1

正確に何を求めているのかわかりませんが、環境変数が存在しない場合はgetenv()返されます。NULLポインターの逆参照NULLは未定義の動作であり、渡されたポインターはstrcmp()逆参照されます。NULLしたがって、引数として渡すstrcmp()のは未定義の動作であり、これはセグメンテーション違反である可能性があります(ここで考えられる原因です)。のチェックをオンにstrcmp()して、への呼び出しを保護します。NULLmethod_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 に答える