我正在写一个wireshark解剖器并遇到奇怪的内存管理问题。我有以下功能:
guint8* foo_hex2bytes(guchar *str, guint len){
...
//allocate memory for the result and start converting
res = (guint8*)wmem_alloc(scope, sizeof(guint8)*((len>>1)));
for(i=0; i<(len>>1); i++){
//check that the two digits under question are HEX digits
if(!isxdigit(*(str+2*i)) || !isxdigit(*(str+2*i+1))){
wmem_free(scope, res);
return NULL;
}
//append the byte
sscanf((const char*)(str+2*i), "%02x", &res[i]);
}
return res;
}
此函数用于多个位置(proto_reg_hanoff_foo
以及dissect_foo
),因此我不会将结果分配给任何特定池。
在我的proto_reg_handoff_foo
我得到函数的返回值,将其复制到另一个内存位置并释放原始结果:
...
if(syskey_str && strlen(syskey_str)){
wmem_free(wmem_epan_scope(), syskey_bytes);
if(tmp = foo_hex2bytes((guchar*)syskey_str, (guint) strlen(syskey_str))){
syskey_len = (guint)strlen(syskey_str)>>1;
syskey_bytes = (guint8*)wmem_alloc(wmem_epan_scope(), strlen(syskey_str)>>1);
memcpy(syskey_bytes, tmp, strlen(syskey_str)>>1);
wmem_free(NULL, tmp);
}
}
...
奇怪的是,我在wmem_free(NULL, tmp)
行获得了一个Windows触发的断点(或调试器外的普通崩溃)。除了在wmem_core.c:72
发生错误这一事实之外,我无法收集真正的调试信息。
N.B。我修改了foo_hex2bytes
以接受第三个wmem_allocator_t
参数,只是简单地传递了wmem_epan_scope()
(或wmem_packet_scope()
) - 这会导致应用程序关闭时类似的崩溃。我也尝试使用malloc()
并手动清除所有内存(有时会工作,有时返回null pointer
,即使应用程序只使用14K内存并且有更多可用内存)。
编辑:问题似乎存在于行sscanf(...)
中 - 我没有分配足够的内存而且它已经超支。通过增加分配大小来修复。
答案 0 :(得分:1)
在致电foo_hex2bytes
时,您syskey_str
传递了devkey_str
,但syskey_str
的长度 - 应该是{{1}}的长度?
您获得的断点只是意味着由于写入内存超出分配范围而导致堆已损坏。