如何在ndis驱动程序中处理缓冲区溢出

时间:2013-09-12 07:02:07

标签: driver ndis

如何在ndis驱动程序中处理缓冲区溢出。任何人都可以告诉一些缓冲区溢出情况或缓冲区溢出情况的一些用例。

1 个答案:

答案 0 :(得分:2)

对于NDIS微型端口驱动程序

如果收到的数据包大于MTU,请将其丢弃。不要将数据包指示到NDIS(即,不要将数据包传递给NdisMIndicateReceiveNetBufferLists)。如果可能,请增加ifInErrors统计计数器。

上述规则不受NDIS_PACKET_TYPE_PROMISCUOUS标志的影响;即使处于混杂模式,也不要指示过大的数据包。但是,如果您的硬件允许,您应该在混杂模式下指示过小(又称“欠幅”)数据包。

如果要求您传输大于MTU的数据包,请勿尝试传输。分配NET_BUFFER_LIST::Status = NDIS_STATUS_INVALID_LENGTH并使用NdisMSendNetBufferListsComplete将NBL返回给NDIS。 (我不希望你看到这样的数据包;如果NDIS试图向你发送这样的数据包,那将是一个错误。)

对于NDIS协议驱动程序

如果收到的数据包大于MTU,您可以自由丢弃。

永远不要尝试发送大于MTU的数据包。

对于NDIS过滤器驱动程序

如果过滤器收到的数据包大于MTU(FilterReceiveNetBufferLists),过滤器可能会立即丢弃该数据包(NdisFReturnNetBufferLists如果未使用NDIS_RECEIVE_FLAGS_RESOURCES进行接收指示,如果设置了资源标志,则立即返回。

如果要求过滤器发送大于MTU(FilterSendNetBufferLists)的数据包,过滤器可能会分配NET_BUFFER_LIST::Status = NDIS_STATUS_INVALID_LENGTH并立即返回数据包(NdisFSendNetBufferListsComplete)。

过滤器没有义务验证通过它们的每个数据包的大小。但是,您的过滤器应验证任何数据包的大小,否则格式错误的数据包会导致过滤器触发缓冲区溢出。例如,如果您的过滤器将所有ARP回复复制到预先分配的缓冲区中,请首先验证ARP回复是否太大而无法放入缓冲区。 (这不是绝对必要的,因为微型端口“不应该”给你一个过大的数据包。但是, 在网络数据路径上,这意味着你正在处理被处理的不受信任的数据一个潜在的错误微型端口。一个额外的防御深度是一个好主意。)

过滤器不得发起大于MTU的数据包(在发送或接收路径上)。