如果句柄为NULL,则pcap_close()崩溃

时间:2020-01-21 20:03:23

标签: c pcap libpcap

是否期望pcap_close(NULL)存在段错误?我在libpcap-1.7.4-2ubuntu0.1上观察到此行为。 man页未提及NULL pcap_t *的功能行为。我用谷歌搜索,也找不到任何东西。

3 个答案:

答案 0 :(得分:3)

来自the manual page

#include <pcap/pcap.h>
void pcap_close(pcap_t *p);

pcap_close()关闭与p关联的文件并释放资源。

很明显,该函数应与 valid 指针一起使用。 NULL指针没有需要释放的“关联文件”或“资源”。该函数使用变量p并假定它是指向有效pcap_t类型的指针。传入NULL会使它取消引用NULL,这当然会导致分段错误。

the source code,这一点更加明显:

void
pcap_close(pcap_t *p)
{
    if (p->opt.device != NULL)
        free(p->opt.device);
    p->cleanup_op(p);
    free(p);
}

这种行为非常普遍,您几乎可以在用于关闭/释放/清理以前请求的资源的每个C库函数中找到它。在C语言中,NULL检查几乎总是留给调用者,如果没有,您很可能会发现它明确写在文档中。

答案 1 :(得分:3)

其他答案是正确的。通常,(并非专门针对pcap_close),除非有文件证明接受某个空指针并对其进行特殊处理,否则默认假设应始终是传递空指针违反了接口联系人,因为空指针不是有效的指针,指向要记录的函数希望接收到的任何指针。

答案 2 :(得分:2)

没有文档?只需检查source code

void pcap_close(pcap_t *p)
{    
    if (p->opt.device != NULL)

        free(p->opt.device);

    p->cleanup_op(p);

    free(p);
}

第一条指令读取的p->opt.device如果pNULL,则行为未定义。

NULL进行保护将是一个容易的增强。另一方面,崩溃是确定性的,并且在传递空指针时很容易调试。