我有一个主要的:
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
答案 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);