我根据教程实现了加密过程:
http://www.openssl.org/docs/crypto/EVP_EncryptInit.html#
当我运行它通过低谷并得到以下报告:
==2371== 176 bytes in 1 blocks are still reachable in loss record 3 of 6
==2371== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64- linux.so)
==2371== by 0x56CA133: CRYPTO_malloc (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==2371== by 0x575280F: lh_new (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==2371== by 0x5754D4F: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==2371== by 0x575503E: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==2371== by 0x5755A1D: ERR_get_state (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==2371== by 0x5755E5E: ERR_put_error (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==2371== by 0x5757E38: EVP_DecryptFinal_ex (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==2371== by 0x46DA2A: unmangleUrl(std::string const&, std::string const&, std::string const&) (mangle_url.cpp:84)
==2371== by 0x46621C: main (main.cpp:348)
我下载了OpenSSL的源代码。在ERR_put_error内部,我看到了ERR_get_state中的内存分配,并在err_clear_data内部释放了内存,但是累积了err_clear_data内部的逻辑。仅当标志ERR_TXT_MALLOCED时它才被释放,并且我看不到谁在升旗。
我做错了什么?
我正在使用Ubuntu 12.04
$ cat /etc/issue
Ubuntu 12.04.2 LTS \n \l
而且OpenSSL版本是
$ openssl version
OpenSSL 1.0.1 14 Mar 2012
我的代码段mangle_url.cpp:
std::string unmangleUrl(const std::string &key, const std::string &iv, const std::string &url)
{
std::string binUrl = hexToBin(url);
std::string res;
res.resize(binUrl.size() * 2);
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
EVP_DecryptInit_ex(&ctx, EVP_bf_cbc(), NULL, (const unsigned char *)&key[0], (const unsigned char *)&iv[0]);
int len;
if(!EVP_DecryptUpdate(&ctx, (unsigned char *)&res[0], &len, (const unsigned char *)&binUrl[0], binUrl.size()))
{
EVP_CIPHER_CTX_cleanup(&ctx);
throw std::runtime_error("cannot decrypt URL");
}
int tmpLen;
if(!EVP_DecryptFinal_ex(&ctx, (unsigned char *)&res[len], &tmpLen))
{
EVP_CIPHER_CTX_cleanup(&ctx);
throw std::runtime_error("cannot decrypt URL");
}
len += tmpLen;
EVP_CIPHER_CTX_cleanup(&ctx);
res.resize(len);
return res;
}
来自OpenSSL err.c的代码:
…
void ERR_put_error(int lib, int func, int reason, const char *file,
int line)
{
ERR_STATE *es;
#ifdef _OSD_POSIX
/* In the BS2000-OSD POSIX subsystem, the compiler generates
* path names in the form "*POSIX(/etc/passwd)".
* This dirty hack strips them to something sensible.
* @@@ We shouldn't modify a const string, though.
*/
if (strncmp(file,"*POSIX(", sizeof("*POSIX(")-1) == 0) {
char *end;
/* Skip the "*POSIX(" prefix */
file += sizeof("*POSIX(")-1;
end = &file[strlen(file)-1];
if (*end == ')')
*end = '\0';
/* Optional: use the basename of the path only. */
if ((end = strrchr(file, '/')) != NULL)
file = &end[1];
}
#endif
es=ERR_get_state(); <-- memory got allocated
es->top=(es->top+1)%ERR_NUM_ERRORS;
if (es->top == es->bottom)
es->bottom=(es->bottom+1)%ERR_NUM_ERRORS;
es->err_flags[es->top]=0;
es->err_buffer[es->top]=ERR_PACK(lib,func,reason);
es->err_file[es->top]=file;
es->err_line[es->top]=line;
err_clear_data(es,es->top); <-- suppose to be released
}
…
ERR_STATE *ERR_get_state(void)
{
static ERR_STATE fallback;
ERR_STATE *ret,tmp,*tmpp=NULL;
int i;
CRYPTO_THREADID tid;
err_fns_check();
CRYPTO_THREADID_current(&tid);
CRYPTO_THREADID_cpy(&tmp.tid, &tid);
ret=ERRFN(thread_get_item)(&tmp);
/* ret == the error state, if NULL, make a new one */
if (ret == NULL)
{
ret=(ERR_STATE *)OPENSSL_malloc(sizeof(ERR_STATE)); <-- memory got allocated
if (ret == NULL) return(&fallback);
CRYPTO_THREADID_cpy(&ret->tid, &tid);
ret->top=0;
ret->bottom=0;
for (i=0; i<ERR_NUM_ERRORS; i++)
{
ret->err_data[i]=NULL;
ret->err_data_flags[i]=0;
}
tmpp = ERRFN(thread_set_item)(ret);
/* To check if insertion failed, do a get. */
if (ERRFN(thread_get_item)(ret) != ret)
{
ERR_STATE_free(ret); /* could not insert it */
return(&fallback);
}
/* If a race occured in this function and we came second, tmpp
* is the first one that we just replaced. */
if (tmpp)
ERR_STATE_free(tmpp);
}
return ret;
}
…
#define err_clear_data(p,i) \
do { \
if (((p)->err_data[i] != NULL) && \
(p)->err_data_flags[i] & ERR_TXT_MALLOCED) \ <-- weired logic with ERR_TXT_MALLOCED flag
{ \
OPENSSL_free((p)->err_data[i]); \
(p)->err_data[i]=NULL; \
} \
(p)->err_data_flags[i]=0; \
} while(0)
在退出程序之前调用这些函数,就可以了:
CRYPTO_cleanup_all_ex_data();
ERR_free_strings();
ERR_remove_state(0);
EVP_cleanup();
TL;dr:如何在没有随机文本的情况下将无符号32位整数转换为chars/uint8_t 好的,我愿意为此牺牲几个声誉点。我需要快速将一个4字节的无符号整数转换为数组字节,以便读取/写入/操作我自己结构的二进制文件。 这样我就可以读取一个结构,然后将其用作对象,而不是读取它,为每个更改写入它。 但是当我尝试实现一个函数时,我得到了一个泄漏。指针只是不断在函数范围之外添加值。 主要: 和输出: 在我
或者javascript引擎足够聪明,不会在内存中保存函数的词法环境的值,而它不使用这个环境?
我尝试用一个大表(大约一万条记录)中的记录填充JdbcRowSet。我尝试了两个变体(参见下面的代码): 创建连接对象,使用JdbcRowSetImpl(connection)实例化,在循环中执行查询。 使用JdbcRowSetImpl(DriverManager.GetConnection(“jdbc:....”)实例化,在循环中执行查询。 第一个变体会导致内存泄漏,直到堆满为止。第二个变体没有
我有一个在Tomcat7上运行的web应用程序的问题。 当我尝试重新启动web应用程序时,我在servlet内部创建的线程打开的端口仍然是打开的。 “http-bio-8080-acceptor-0”后台进程prio=10 tid=0x00007F4ED4206000 nid=0x71f0 runnable[0x00007F4ECC78F000]java.lang.thread.state:run
我在Tomcat中得到了threadlocal内存泄漏错误,我正在使用ThreadPool,但在我的WebApp中没有threadlocal的实现。 严重:web应用程序[/mywebapp]创建了一个ThreadLocal,其键类型为[org.a pache.http.impl.cookie.dateformatholder$1](值为[org.apache.http.imp l.cookie.
本文向大家介绍浅析Java中的内存泄漏,包括了浅析Java中的内存泄漏的使用技巧和注意事项,需要的朋友参考一下 ava最明显的一个优势就是它的内存管理机制。你只需简单创建对象,java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏。 本教程演示了什么是内存泄漏,为什么会发生内存泄漏以及如何预防内存泄漏。 什么是内存泄漏? 定义:如果对象在应用中