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 parametro [out] o [in,out], i dati restituiti per tale parametro vengono copiati nel buffer esistente. Se i dati restituiti sono maggiori del buffer passato, può verificarsi un sovraccarico del buffer quando RPC copia i dati restituiti nel buffer troppo piccolo. Vedere Puntatori di primo livello e 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 nelle dimensioni del buffer specificate, 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 al carattere di terminazione Null ) 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, quindi è 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 un buffer non Null venga passato 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 non sia impostato su 0. Si noti che RPC consentirà a Length di essere pari a 0 mentre MyString è diverso da NULL e RPC considererà MyString come allocazione del buffer di lunghezza 0.