我正在写一个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处发生错误这一事实之外,我无法收集任何真正的调试信息。
注意:我修改了我的foo_hex2bytes以接受第三个wmem_allocator_t参数,并简单地传递了wmem_epan_scope()(或wmem_packet_scope()(如果合适的话)–这会在应用程序关闭时导致类似的崩溃。我还尝试过使用malloc()并手动清除所有内存(有时有效,有时返回null pointer,即使应用程序只使用14K内存,并且有更多可用内存)。
编辑:这个问题似乎存在于 -我没有分配足够的内存,它是超量的。通过增加分配大小来修复。

最佳答案

在您呼叫foo_hex2bytes时,您正在传入syskey_str,但是devkey_str的长度应该是syskey_str的长度?
您得到的断点仅仅意味着堆由于写入超出分配的内存而损坏。

关于c - Wireshark插件引起“堆损坏”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25199991/

10-12 21:55