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;

私の問題は、メインのdofree(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]

理由がわかりません。

OS: 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

ドキュメントから:

返されたメッセージ ダイジェストはメッセージ コンテキスト内に割り当てられるため、コンテキストが解放されるまで有効です [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;
于 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 は、計算を終了した後にメッセージ ダイジェストを返します。この関数は必要に応じて何度でも使用できますが、1 つのハンドルに対して常に同じ値を返します。返されたメッセージ ダイジェストはメッセージ コンテキスト内に割り当てられるため、コンテキストが解放されるまで有効です。

したがって、コンテキストが解放された後もポインターを保持したくない場合は、何かを malloc したり解放したりする必要はありません。

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