Как я могу справиться с переполнением буфера в драйвере ndis. Может ли кто-нибудь рассказать о некоторых сценариях переполнения буфера или некоторых случаях использования условий переполнения буфера.
Как справиться с переполнением буфера в драйвере ndis
Ответы (1)
Для драйверов минипорта NDIS
Если вы получили пакет, размер которого превышает MTU, отбросьте его. Не указывать пакет до NDIS (т. е. не передавать пакет NdisMIndicateReceiveNetBufferLists
). Если возможно, увеличьте значение статистического счетчика ifInErrors
.
На приведенное выше правило не влияет флаг NDIS_PACKET_TYPE_PROMISCUOUS
; не указывать слишком большие пакеты даже в неразборчивом режиме. Тем не менее, вы должны указывать чрезмерно маленькие (так называемые «короткие») пакеты в неразборчивом режиме, если это позволяет ваше оборудование.
Если вас попросят передать пакет, размер которого превышает MTU, не пытайтесь его передать. Назначьте NET_BUFFER_LIST::Status = NDIS_STATUS_INVALID_LENGTH
и верните NBL обратно в 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 не слишком велик для размещения в буфере. (Это не является строго обязательным, так как мини-порт «не должен» отдавать вам слишком большой пакет. Однако вы находитесь в сетевом пути данных, что означает, что вы обрабатываете ненадежные данные, обрабатываемые потенциально глючный мини-порт. Небольшая дополнительная глубокая защита — хорошая идея.)
Фильтры не должны создавать пакеты, размер которых превышает MTU (как на пути отправки, так и на пути приема).