Статус: Новичок
Группы: Участники
Зарегистрирован: 23.05.2019(UTC) Сообщений: 3 Откуда: Москва Поблагодарили: 1 раз в 1 постах
|
Здравствуйте! При вызове функции CryptMsgControl с параметром CMSG_CTRL_DECRYPT происходит утечка памяти (если верить Valgrind). valgrind: Код:==1017==
==1017== 48 bytes in 1 blocks are definitely lost in loss record 75 of 213
==1017== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1017== by 0x51C05DF: CryptImportKey (in /opt/cprocsp/lib/amd64/libcapi10.so.4.0.4)
==1017== by 0x573B1FE: ??? (in /opt/cprocsp/lib/amd64/libcapi20.so.4.0.4)
==1017== by 0x54A8532: ??? (in /opt/cprocsp/lib/amd64/libcapi20.so.4.0.4)
==1017== by 0x54A8ED9: ??? (in /opt/cprocsp/lib/amd64/libcapi20.so.4.0.4)
==1017== by 0x54F32E1: CryptMsgControl (in /opt/cprocsp/lib/amd64/libcapi20.so.4.0.4)
==1017== by 0x4011C7: decrypt() (main.cpp:60)
==1017== by 0x40129F: main (main.cpp:70)
==1017==
пример кода: Код: const DWORD dwEnc = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
std::ifstream f("file", std::ios::in | std::ios::binary);
CMSG_STREAM_INFO streamInf;
...
auto hMsg = CryptMsgOpenToDecode(dwEnc, 0, 0, 0, nullptr, &streamInf);
char buffer[1024];
auto n = sizeof(buffer);
while (n == sizeof(buffer)) {
n = f.readsome(buffer, sizeof(buffer));
CryptMsgUpdate(hMsg, reinterpret_cast<BYTE*>(buffer), n,
n < sizeof(buffer));
}
DWORD cbSize = 0;
CryptMsgGetParam(hMsg, CMSG_RECIPIENT_INFO_PARAM, 0, nullptr, &cbSize);
auto info = reinterpret_cast<CERT_INFO*>(new char[cbSize]);
CryptMsgGetParam(hMsg, CMSG_RECIPIENT_INFO_PARAM, 0, info, &cbSize);
auto certStore = CertOpenSystemStore(0, "MY");
auto cert = CertFindCertificateInStore(certStore, dwEnc, 0,
CERT_FIND_SUBJECT_CERT, info, nullptr);
CMSG_CTRL_DECRYPT_PARA decrPara;
bzero(&decrPara, sizeof(decrPara));
decrPara.cbSize = sizeof(decrPara);
CryptAcquireCertificatePrivateKey(cert, CRYPT_ACQUIRE_CACHE_FLAG |
CRYPT_ACQUIRE_COMPARE_KEY_FLAG, nullptr,
&decrPara.hCryptProv, &decrPara.dwKeySpec, nullptr);
CryptMsgControl(hMsg, 0, CMSG_CTRL_DECRYPT, &decrPara);
CryptReleaseContext(decrPara.hCryptProv, 0);
delete [] reinterpret_cast<char*>(info);
CertFreeCertificateContext(cert);
CertCloseStore(certStore, 0);
CryptMsgClose(hMsg);
ОС Ubuntu Linux 16.04. CryptoPro for Linux 4.0 R4. (x86_64, deb). Примечание: если убрать CMSG_STREAM_INFO, то утечки не будет. Отредактировано пользователем 23 мая 2019 г. 15:32:59(UTC)
| Причина: Не указана
|