【问题标题】:pcap_close() crashes if handle is NULL如果句柄为 NULL,pcap_close() 会崩溃
【发布时间】:2020-01-21 20:03:23
【问题描述】:

预计pcap_close(NULL) 会出现段错误吗?我在libpcap-1.7.4-2ubuntu0.1 上观察到这种行为。 man 页面没有说明 NULL pcap_t * 的函数行为。我用谷歌搜索也找不到任何东西。

【问题讨论】:

  • 您找到了答案:保护呼叫免受 NULL 影响

标签: c pcap libpcap


【解决方案1】:

来自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 检查几乎总是留给调用者,如果不是,您很可能会在文档中明确地找到它。

【讨论】:

    【解决方案2】:

    其他答案都是正确的。通常(不特定于pcap_close),除非有文档接受空指针并对其进行特殊处理,否则默认假设应该始终是传递空指针违反接口联系,因为空指针不是一个有效的指针,指向任何记录的函数期望接收到的指针。

    【讨论】:

      【解决方案3】:

      没有文档?只需检查source code

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

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

      防止NULL 将是一个简单的增强。另一方面,崩溃是确定性的,并且可以在传递空指针时轻松调试。

      【讨论】:

      • 这很容易,而不是简单的增强。相反,它会掩盖当前捕获的调用者中的错误。
      • 是的。 “另一方面,崩溃是确定性的,并且可以在传递空指针时轻松调试”,因为我的回答结束了。 fclose 在通过 NULL 时失败,但 free 保证可以工作……去看看。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多