如何在Linux上处理数据包时检查潜在的数组是否超出范围?

时间:2018-06-13 16:37:16

标签: linux pointers ip ethernet packet

我正在进行套接字编程,需要在Linux上解析数据包。 Linux提供的一般框架是拥有缓冲区(u_char*),将其转换为以太网头(假设它是以太网),读取下一个协议(例如IP),移动指针并将其转换为IP头,然后转到下一个协议(例如TCP)。

所以我关注的是大胆的部分:我们怎样才能确保移动指针合法?通常人们只检查协议并假设数据包已完成。但我怀疑这是否总是如此。

例如:

const u_char* packet = ...; // Receive the packet
struct ethhdr* ethHdr = (struct ethhdr*)packet;
if (ntohs(ethHdr->h_proto) == ETH_P_IP) {
  struct ip* ipHdr = (struct ip*)(packet + sizeof(struct ethhdr));
}

那么对于第四行,为什么我们相信这样的指针添加是安全的?有没有办法检查长度?

提前致谢!

0 个答案:

没有答案