1

如何处理 ndis 驱动程序中的缓冲区溢出。谁能告诉一些缓冲区溢出场景或缓冲区溢出条件的一些用例。

4

1 回答 1

2

对于 NDIS 微型端口驱动程序

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

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

如果要求您传输大于 MTU 的数据包,请不要尝试传输它。分配NET_BUFFER_LIST::Status = NDIS_STATUS_INVALID_LENGTHNBL 并将其返回给 NDIS,使用NdisMSendNetBufferListsComplete. (我不希望您看到这样的数据包;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 回复是否太大而无法放入缓冲区。(这不是绝对必要的,因为微型端口“不应该”给您一个过大的数据包。但是,您网络数据路径上,这意味着您正在处理由可能有问题的微型端口处理的不受信任的数据。A一点额外的纵深防御是个好主意。)

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

于 2013-09-14T05:21:25.860 回答