2017-06-26 8 views
-1

Apacheが新たに再起動された場合、最初のいくつかのSUBMITSは問題ありません。しかし、いくつかのテストの後、 "v"の壊れたバージョンを印刷し始めます。Apache:いくつかのPOST後にコンテンツが破損する

int main() { 
    while (FCGI_Accept() >= 0) { 
     printf("Content-Type: text/html;\n\n"); 

     int content_len; 
     content_len = atoi(getenv("CONTENT_LENGTH")); 

     char v[100]; 
     fread(v,content_len,1,stdin); 
     printf("%s",v); 

     FCGI_Finish(); 
    } 
    return 0; 
} 

更新:おそらく私は「無料(v)」にする必要があります。 ?使用したメモリなどをリセットします。明らかに、それはどこかに保存されています...そしてそれは空にする必要があります。

おそらくこれはhttpd.confの自分のfcgi設定と関係がありますか?

+1

「content_len」は100未満ですか? – Barmar

+0

これは、以前の送信からの値を出力することがあります。 –

+0

いいえ、あなたは 'v'を解放する必要はありません。実際はそうしてはいけません。 'free()'は、動的に割り当てられたメモリブロックの先頭へのポインタにのみ適用されなければなりません。 –

答えて

1

fread() nullターミネータを追加しない場合は、追加する必要があります。

fread(v,content_len,1,stdin); 
v[content_len] = '\0'; 

そうでない場合は、printf()を読んでいたものを超えた文字列で初期化されていない文字を印刷します。

vもコンテンツを保持するのに十分な大きさであることを確認する必要があります。代わりに、サイズをハードコーディング、あなたが行うことができます:

char v[content_len+1]; 

free()malloc()calloc()、またはrealloc()によって返されたポインタのみを使用することができますので、あなたは、free(v)する必要はありません。

+0

スワップ1、content_len;結果を変数に格納して、短い読み込みを取得しないようにしてください... –

関連する問題