Compartilhar via


Proteção de buffer MCCP

A partir do Windows Vista, o Mecanismo de Marshalling do RPC executa mais etapas para tentar evitar sobrecargas de buffer do lado do cliente devido aos dados retornados. Essa instalação é chamada de MCCP (Mini Compute Conformance Protection).

Quando o cliente passa um ponteiro para um buffer existente para um parâmetro [fora] ou [no,parâmetro] , os dados retornados para esse parâmetro são copiados para o buffer existente. Se os dados retornados forem maiores que o buffer passado, uma sobrecarga de buffer poderá ocorrer quando o RPC copiar os dados retornados para o buffer muito pequeno. Consulte Top-Level e ponteiros inseridos.

Com o MCCP, o RPC tenta detectar essa condição e rejeitar a chamada se ela for detectada. Para buffers com um valor de correlação, como [size_is], se os dados retornados não se ajustarem ao tamanho do buffer especificado, a chamada será rejeitada e RPC_X_BAD_STUB_DATA exceção será gerada. Para cadeias de caracteres não dimensionadas, a chamada será rejeitada se o tamanho da cadeia de caracteres existente (comprimento até o terminador de nulo) for insuficiente para manter a cadeia de caracteres retornada, a chamada será rejeitada. O RPC não pode detectar sobrecargas de buffer em todas as condições, portanto, o desenvolvedor é aconselhado a continuar a tomar precauções normais contra sobrecargas de buffer.

Se o cliente não passar um buffer existente para um parâmetro [] mas, em vez disso, passar um ponteiro desreferenciado para NULL, o RPC seguirá regras normais para alocar um novo buffer em nome do cliente. Esse buffer será alocado com espaço suficiente para armazenar os dados retornados.

Uma segunda proteção é que, para parâmetros correlacionados, o RPC imporá que um buffer denulo não seja passado quando a variável de contagem de correlação não fornulo.

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

Se MyString for NULL, o RPC rejeitará a chamada, a menos que length esteja definido como 0. Observe que o RPC permitirá que de Comprimento seja 0 enquanto MyString não forNULL, e o RPC tratará MyString como uma alocação de buffer de 0 comprimento.