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' 已经是一个指针,所以它不需要 '&' 运算符。

fread 行应为

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

你所做的基本上是将一个新的指针值读入秘密(而不是秘密指向的内存),并且读取太多,溢出到你的其他变量中。如果你在这个函数中使用了 secret,它也会出现段错误(希望如此,或者如果你不走运的话,会在程序的其他部分造成随机损坏)。

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*覆盖秘密的值,然后可能是文件,而不是写入秘密指向的值。

于 2009-07-28T09:39:13.473 回答