Compartir a través de


Protección del búfer MCCP

A partir de Windows Vista, el motor de serialización de RPC realiza pasos adicionales para intentar evitar que se supere el búfer del lado cliente debido a los datos devueltos. Esta instalación se denomina Mini Compute Conformance Protection (MCCP).

Cuando el cliente pasa un puntero a un búfer existente a un parámetro [out] o [in,out], los datos devueltos para ese parámetro se copian en el búfer existente. Si los datos devueltos son mayores que el búfer pasado, se puede producir una saturación de búfer cuando RPC copia los datos devueltos en el búfer demasiado pequeño. Consulte Punteros de nivel superior e incrustados.

Con MCCP, RPC intenta detectar esta condición y rechazar la llamada si se detecta. En el caso de los búferes con un valor de correlación, como [size_is], si los datos devueltos no caben en el tamaño de búfer especificado, se rechaza la llamada y se produce RPC_X_BAD_STUB_DATA excepción. En el caso de las cadenas sin tamaño, la llamada se rechaza si el tamaño de cadena existente (longitud hasta que el terminador nulo ) no es suficiente para contener la cadena devuelta, se rechaza la llamada. RPC no puede detectar saturaciones de búfer en todas las condiciones, por lo que se recomienda al desarrollador seguir tomando precauciones normales contra las saturaciones del búfer.

Si el cliente no pasa un búfer existente para un parámetro [out], sino que pasa un puntero desreferenciado a NULL, RPC seguirá las reglas normales para asignar un nuevo búfer en nombre del cliente. Este búfer se asignará con espacio suficiente para contener los datos devueltos.

Una segunda protección es que para los parámetros correlacionados, RPC aplicará que se pase un búfer que no sea NULL cuando la variable de recuento de correlación no sea NULL.

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

Si MyString es NULL, RPC rechazará la llamada a menos que Length esté establecido en 0. Tenga en cuenta que RPC permitirá que Length sea 0 mientras MyString no sea NULL y RPC tratará MyString como una asignación de búfer de 0 longitud.