0

我有一个主要的:

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

4

2 回答 2

3

文档

返回的消息摘要在消息上下文中分配,因此在上下文 [原文如此] 被释放之前有效。

因此,您需要确保释放消息上下文,但不需要 allocate 或 free 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;
于 2013-02-18T18:29:13.397 回答
2

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

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

gcry_md_read的文档指出:

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

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

unsigned char *hmac = gcry_md_read(hd, GCRY_MD_SHA512);
于 2013-02-18T18:28:57.417 回答