我显然遗漏了一些东西。有人可以解释为什么会发生这种情况吗?
#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;
}
答案 0 :(得分:9)
你正在粉碎堆栈,在读取'secret'变量时用borked覆盖文件变量。 '秘密'已经是一个指针,所以它不需要'&'操作
fread line应该是
RetVal=fread(secret,1,size,file);
你正在做的事情基本上是将一个新的指针值读入秘密(而不是秘密所指向的内存),并且阅读方式太多,溢出到你的其他变量中。如果你在这个函数中使用了秘密,那么它也会被分段(如果你运气不好,希望,或者在程序的其他部分造成随机损坏)。
HTH。
答案 1 :(得分:4)
我猜这个问题就在这里:
RetVal=fread(&secret,1,size,file);
你的意思是:
RetVal=fread(secret,1,size,file);
或者,secret
指向的缓冲区长度不是size
个字节。你有正确的分配吗?
答案 2 :(得分:3)
fread(&secret,...
类型的秘密的 char*
会覆盖secret的值,然后可能是file,而不是写入secret指向的值。