Proteção de buffer MCCP

A partir do Windows Vista, o Mecanismo de Marshalling RPC executa etapas adicionais para tentar evitar estouros de buffer do lado do cliente devido a 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 [out] ou [in,out], os dados retornados para esse parâmetro são copiados para o buffer existente. Se os dados retornados forem maiores que o buffer passado, um estouro de buffer poderá ocorrer quando o RPC copiar os dados retornados para o buffer muito pequeno. Consulte Ponteiros de nível superior e 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 nulo ) for insuficiente para manter a cadeia de caracteres retornada, a chamada será rejeitada. O RPC não pode detectar estouros de buffer em todas as condições, portanto, é recomendável que o desenvolvedor continue a tomar precauções normais contra estouros de buffer.

Se o cliente não passar um buffer existente para um parâmetro [out], mas 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 manter os dados retornados.

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

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 Length seja 0 enquanto MyString não for NULL e o RPC tratará MyString como uma alocação de buffer de 0 comprimento.