2009-07-28 28 views
1

私は明らかに何かが欠けています。誰かがなぜこれが起こるのか説明してもらえますか?fcloseでsegfaultを使用する理由

#define RANDOM_DEVICE "/dev/random" 
int create_shared_secret(char * secret,int size) 
{ 
    FILE * file=NULL; 
    int RetVal; 

    file=fopen(RANDOM_DEVICE,"r"); 
    if(!file) 
    { 
    printf("Unable to open random device %s\n",RANDOM_DEVICE); 
    exit(-1); 
    } 
    RetVal=fread(&secret,1,size,file); 
    if(RetVal!=size) 
    { 
    printf("Problem getting seed value\n"); 
    exit(-1); 
    } 

    if(file) fclose(file); //segfault right here 
    return 0; 
} 

答えて

9

「秘密」変数を読み込むときに、ファイル変数をボールドに上書きしてスタックを破壊しています。 'secret'はすでにポインタなので、 '&'演算子は必要ありません。

関数fread行が何をやっていることは基本的に(代わりに秘密が指しているメモリの)秘密に新しいポインタ値を読み取り、あまりにも多く読んで、にあふれて

RetVal=fread(secret,1,size,file); 

をお読みくださいあなたの他の変数。この関数内で秘密を使用していた場合は、segfaulted(うまくいけば、あなたが不運な場合にはプログラムの他の部分でランダムなダメージを与えます)。

HTH。

+0

私は愚かな何かをしたと信じられません。ありがとう。 – Belrog

+0

正解と優秀な説明の勝利の組合せのための+1。 –

+0

@caf: 'fread'は' void * 'を取ります。約警告はありません。 –

4

私の推測では、問題はここです:

RetVal=fread(&secret,1,size,file); 

はもしかして:

RetVal=fread(secret,1,size,file); 

それともを、バッファは本当にsizeバイト長ではありませんsecretによって指さ。それを正しく割り当てましたか?

3

秘密がchar*の場合、秘密が指し示す値に書き込むのではなく、scecretの値を上書きし、次にprobalyファイルを上書きします。