1

私は明らかに何かが欠けています。なぜこれが起こるのか誰かが説明してもらえますか?

#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;
}
4

3 に答える 3

9

'secret'変数を読み取るときに、ファイル変数を中断されたもので上書きして、スタックを破壊しています。「secret」はすでにポインタであるため、「&」演算子は必要ありません。

fread行は次のようになります

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

基本的に、(シークレットが指しているメモリではなく)新しいポインタ値をシークレットに読み込み、読み取りすぎて他の変数にオーバーフローします。この関数内でシークレットを使用した場合は、セグフォールトも発生します(うまくいけば、運が悪ければプログラムの他の部分にランダムなダメージを与えます)。

HTH。

于 2009-07-28T09:39:00.043 に答える
4

私の推測では、問題はここにあります:

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

もしかして:

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

あるいは、が指すバッファsecretは実際にはsizeバイト長ではないかもしれません。正しく割り当てましたか?

于 2009-07-28T09:39:09.760 に答える
3

fread(&secret,...シークレットのタイプは、シークレットがchar*指す値に書き込む代わりに、scecretの値を上書きしてから、ファイルを作成します。

于 2009-07-28T09:39:13.473 に答える