2013-02-18 2 views
0

У меня есть главное чтобы сделать:Ошибка при освобождении памяти используется функция в C

unsigned char *f_hmac = calculate_hmac(output_file_path, mac_key, keyLength); 
fwrite(f_hmac, 1, 64, fpout); 
free(f_hmac); 

и функция (прототипом которой является: unsigned char *calculate_hmac(const char *filename, const unsigned char *key, size_t keylen)), что делать:

unsigned char *hmac = malloc(64); 
hmac = gcry_md_read(hd, GCRY_MD_SHA512); 
return hmac; 

Моя проблема что когда главная сделать free(f_hmac) я получил:

*** glibc detected *** ./polcrypt: free(): invalid pointer: 0x00000000023a8ad8 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7f0fd662db96] 
./polcrypt[0x40220f] 
./polcrypt[0x401851] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f0fd65d076d] 
./polcrypt[0x4015e9] 

и я не понимаю, почему.

ОС: GNU/Linux Ubuntu 12,10
GCC 4.7.2/Clang 3.2
CFLAGS -Wall -Wextra -D_FORTIFY_SOURCE=2 -O2 -Wformat -Wformat-security -fstack-protector-all -fmudflap -fPIE

ответ

3

От the docs:

Возвращенный дайджест сообщения выделяется в контексте сообщения и поэтому действует до тех пор, пока не будет освобожден conext [sic].

Итак, вы должны убедиться, что вы освободили контекст сообщения, но вам не нужно выделять или освобождать hmac.

Если Вы выпустите контекст сообщения, прежде чем вернуться из calculate_hmac, вам нужно скопировать HMAC из:

unsigned char *hmac = malloc(64); 
unsigned char *m_hmac = gcry_md_read(gd, GCRY_MD_SHA512); 
memcpy(hmac, m_hmac, 64); 
return hmac; 
+0

Спасибо !!! Вы решили мою проблему !!! – polslinux

2

Вы выделяющие hmac, то переписав вновь выделенный указатель с результатом gcry_md_read:

unsigned char *hmac = malloc(64); 
hmac = gcry_md_read(hd, GCRY_MD_SHA512); 

В документации по делу gcry_md_read указано, что:

gcry_md_read возвращает дайджест сообщения после завершения расчета. Эта функция может использоваться так часто, как требуется, но она будет возвращать одно и то же значение для одного дескриптора. Сводка возвращаемого сообщения выделяется в контексте сообщения и поэтому действует до тех пор, пока не будет выпущен контекст.

Так что если вы хотите сохранить указатель вокруг после того, как контекст выходит, вы не должны таНос или бесплатно что-нибудь:

unsigned char *hmac = gcry_md_read(hd, GCRY_MD_SHA512); 
Смежные вопросы