2009-07-28 26 views
1

我明顯錯過了一些東西。有人可以解釋爲什麼會發生這種情況嗎?爲什麼segfault on fclose?

#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

你正在粉碎你的堆棧,在讀取'祕密'變量時用一些borked覆蓋文件變量。 '祕密'已經是一個指針,所以它不需要'&'操作符。

的FREAD行應爲

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

你在做什麼基本上讀一個新的指針值到祕密(而不是其中的祕密是指向內存),和閱讀的方式太多了,溢出到你的其他變量。如果你在這個函數中使用了祕密,它也會被隔離(希望如果你不幸,或者在你的程序的其他部分造成了隨機損傷)。

HTH。

+0

不能相信我做了一件愚蠢的事。謝謝。 – Belrog 2009-07-28 09:44:03

4

我的猜測是問題就在這裏:

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

您是不是要找:

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

或許,緩衝指向secret是不是真的size字節長。你分配正確嗎?

3

fread(&secret,...與祕密是類型char*覆蓋scecret的值,然後probaly文件,而不是寫入祕密指向的值。