Condividi tramite


Protezione buffer MCCP

A partire da Windows Vista, il motore di marshalling RPC esegue ulteriori passaggi per tentare di evitare sovraccarichi del buffer sul lato client a causa di dati restituiti. Questa funzionalità è denominata Mini Compute Conformance Protection (MCCP).

Quando il client passa un puntatore a un buffer esistente a un [out] o [in,out] parametro, i dati restituiti per tale parametro vengono copiati nel buffer esistente. Se i dati restituiti sono maggiori del buffer passato, un sovraccarico del buffer può verificarsi quando RPC copia i dati restituiti nel buffer troppo piccolo. Vedere Top-Level e puntatori incorporati.

Con MCCP, RPC tenta di rilevare questa condizione e rifiutare la chiamata se viene rilevata. Per i buffer con un valore di correlazione, ad esempio [size_is], se i dati restituiti non rientrano nella dimensione del buffer specificata, la chiamata viene rifiutata e viene generata RPC_X_BAD_STUB_DATA eccezione. Per le stringhe non ridimensionate, la chiamata viene rifiutata se la dimensione della stringa esistente (lunghezza fino a quando il null terminatore) non è sufficiente per contenere la stringa restituita, la chiamata viene rifiutata. RPC non è in grado di rilevare i sovraccarichi del buffer in tutte le condizioni, pertanto è consigliabile che lo sviluppatore continui a adottare precauzioni normali contro i sovraccarichi del buffer.

Se il client non passa un buffer esistente per un parametro [out] , ma passa invece un puntatore dereferenziato a NULL, RPC seguirà le normali regole per allocare un nuovo buffer per conto del client. Questo buffer verrà allocato con spazio sufficiente per contenere i dati restituiti.

Una seconda protezione è che per i parametri correlati, RPC impone che venga passato un buffer nullnull quando la variabile del conteggio di correlazioni non ènull.

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

Se MyString è NULL, RPC rifiuterà la chiamata a meno che Length sia impostata su 0. Si noti che RPC consentirà Lunghezza 0 mentre MyString non èNULLe RPC considererà MyString come allocazione di buffer di lunghezza 0.