2015-01-09 4 views
0

좋아, 두 개의 mpz_t를 가변 크기로 읽으려고합니다. 파일 형식 :세그먼트 화 오류 gmp_import

MODULO SIZE [l1] (8 bytes, big endian, measured in bytes) 
EXPONENT SIZE [l2] (8 bytes, big endian, measured in bytes) 
MODULO DATA (l1 bytes, little endian) 
EXPONENT DATA (l2 bytes, little endian) 

하고 들어가는 구조 :

struct kbag 
{ 
    mpz_t modulo; 
    mpz_t exponent; 
}; 

와 코드를 읽기 : 또한

void read_key(FILE *f, struct kbag *k) 
{ 
    unsigned long l1, l2; 
    void *buf; 
    int i; 
    fread(&l1, sizeof(unsigned long), 1, f); 
    fread(&l2, sizeof(unsigned long), 1, f); 
    l1 = ntohl(l1); 
    l2 = ntohl(l2); 
    buf = malloc(l1); 
    fread(buf, l1, 1, f); 
    for (i = 0; i < l1; i++) printf("%02x ", *(char *)(buf +i)); 
    printf("\n"); 
    /* everything up to this point checks out 100% good (from the file) */ 
    mpz_import(k->modulo, l1, 1, 1, 1, 0, buf); //<-- segmentation fault here 
    free(buf); 
    for (i = 0; i < l2; i++) printf("%02x ", *(char *)(buf + i)); 
    printf("\n"); 
    buf = malloc(l2); 
    mpz_import(k->exponent, l2, 1, 1, 1, 0, buf); 
} 

는 kbag 구조체는 다음과 같이 초기화 :

struct kbag *init_kbag() 
{ 
    struct kbag *k = malloc(sizeof(struct kbag)); 
    mpz_init(k->exponent); 
    mpz_init(k->modulo); 
} 

예 ;

30 mpz_import (K-> 모듈 (L1), 1, 1, 1, 0, BUF)에 read_key()

역 추적 전달 K에 불려 s의 (GDB)

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff783035d in realloc() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) back 
#0 0x00007ffff783035d in realloc() from /lib/x86_64-linux-gnu/libc.so.6 
#1 0x00007ffff7b748fc in __gmp_default_reallocate() from /usr/lib/x86_64-linux-gnu/libgmp.so.10 
#2 0x00007ffff7b8a94a in __gmpz_realloc() from /usr/lib/x86_64-linux-gnu/libgmp.so.10 
#3 0x00007ffff7b848d1 in __gmpz_import() from /usr/lib/x86_64-linux-gnu/libgmp.so.10 
#4 0x0000000000400b9a in read_key (f=0x603010, k=0x6032a0) at rsalib.c:30 
#5 0x00000000004009b3 in main (argc=2, argv=0x7fffffffe278) at crypto.c:7 

전체 소스 코드 :이 깨는 이유 https://github.com/phyrrus9/RSA3

아무도 알 수 있습니까? 난 당신이 방금 만든 포인터의 주소를 반환하지 않는

struct kbag *k = init_kbag(); //line 6 crypto.c 

하지만

struct kbag *init_kbag() 
{ 
struct kbag *k = malloc(sizeof(struct kbag)); 
mpz_init(k->exponent); 
mpz_init(k->modulo); 
} 

에서 말할 수있는, 그래서 K 포인터가 아무것도를 가리키는되지 않는까지

+0

어떻게'read_key() '를 호출하는지 보여주세요 – Gopi

+0

'read_key (f, k);'(https://github.com/phyrrus9/RSA3/blob/master/crypto.c#L7) – phyrrus9

답변

0

+0

아주 좋습니다 포인트. 내가 바꿀 수있게 해줘. 하나님 나는이 컴파일러가 그 것에 대해 경고하지 않는 것을 싫어한다. – phyrrus9

+0

잘 보자. 고친다. –

+0

그걸로, 가져 오기 라인을'mpz_import (k-> exponent, 1, 1, l1, 1, 0)'로 바꾼다. 내가 그걸 놓쳤다는 것을 믿을 수 없어. 고맙습니다. – phyrrus9