释放C中函数使用的内存时出错

时间:2013-02-18 18:27:04

标签: c pointers memory-management

我有一个主要的:

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

您正在分配hmac,然后使用gcry_md_read的结果覆盖新分配的指针:

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

gcry_md_read的文档指出:

  

gcry_md_read在完成计算后返回消息摘要。可以根据需要经常使用此函数,但它将为一个句柄返回相同的值。返回的消息摘要在消息上下文中分配,因此在释放conext之前有效。

因此,除非你想在上下文释放后保持指针,你不需要malloc或释放任何东西:

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