Как справиться с переполнением буфера в драйвере ndis

Как я могу справиться с переполнением буфера в драйвере ndis. Может ли кто-нибудь рассказать о некоторых сценариях переполнения буфера или некоторых случаях использования условий переполнения буфера.


person MM WDD    schedule 12.09.2013    source источник
comment
Этот вопрос слишком открытый, чтобы получить полезный ответ. Можете ли вы быть более конкретным в том, что вы после?   -  person Jeffrey Tippet    schedule 12.09.2013
comment
На самом деле, я говорю об условиях переполнения буфера драйвера минипорта reg NDIS. Предположим, приходит какой-либо пакет, размер буфера которого превышает максимальный размер, обрабатываемый драйвером минипорта, тогда как обрабатывать этот случай?   -  person MM WDD    schedule 13.09.2013


Ответы (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 (как на пути отправки, так и на пути приема).

person Jeffrey Tippet    schedule 14.09.2013