Защита буфера MCCP
Начиная с Windows Vista подсистема маршалинга RPC предпринимает дальнейшие действия, чтобы предотвратить переполнение буфера на стороне клиента из-за возвращаемых данных. Это средство называется Mini Compute Conformance Protection (MCCP).
Когда клиент передает указатель на существующий буфер в параметр [out] или [in,out], возвращенные данные для этого параметра копируются в существующий буфер. Если возвращаемые данные больше переданного буфера, может произойти переполнение буфера, когда RPC копирует возвращенные данные в слишком маленький буфер. См. раздел Указатели верхнего уровня и внедренные указатели.
При использовании 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 );
Если myString имеет значение NULL, RPC отклонит вызов, если значение Length не равно 0. Обратите внимание, что RPC разрешает значение Length равно 0, а MyString не равно NULL, а RPC будет рассматривать MyString как выделение буфера длиной 0.