Поделиться через


Защита буфера MCCP

Начиная с Windows Vista подсистема маршаллинга RPC выполняет дальнейшие шаги, чтобы предотвратить переполнение буфера на стороне клиента из-за возвращенных данных. Это средство называется мини-защитой соответствия вычислений (MCCP).

Когда клиент передает указатель на существующий буфер [вне] или [в,из] параметр, возвращенные данные для этого параметра копируются в существующий буфер. Если возвращаемые данные больше переданного буфера, при слишком малом буфере может произойти переполнение буфера, когда RPC копирует возвращенные данные в слишком маленький буфер. См. Top-Level и внедренных указателей.

При использовании MCCP RPC пытается обнаружить это условие и отклонить вызов, если он обнаружен. Для буферов со значением корреляции, например [size_is], если возвращаемые данные не соответствуют указанному размеру буфера, вызов отклоняется и вызывается исключение RPC_X_BAD_STUB_DATA. Для неисчисленных строк вызов отклоняется, если существующий размер строки (длина до конца null) недостаточно для удержания возвращаемой строки, вызов отклоняется. RPC не может обнаруживать переполнение буфера во всех условиях, поэтому разработчику рекомендуется продолжать принимать обычные меры предосторожности в отношении переполнения буфера.

Если клиент не передает существующий буфер для параметра [out], но вместо этого передает указатель на NULL, RPC будет следовать обычным правилам, чтобы выделить новый буфер от имени клиента. Этот буфер будет выделен с достаточным пространством для хранения возвращаемых данных.

Вторая защита заключается в том, что для коррелированных параметров RPC будет применяться, что буфер, отличный отnull, передается, если переменная счетчика корреляций неnull.

HRESULT PassString( [in] DWORD Length, [in, unique, string, size_is( Length )]LPWSTR MyString );

Если MyStringNULL, RPC отклонит вызов, если длина не имеет значения 0. Обратите внимание, что RPC позволит длину 0, а MyString не являетсяNULL, а RPC будет рассматривать MyString как выделение буфера длиной 0.