MCCP-bufferbeveiliging
Vanaf Windows Vista voert de RPC Marshalling Engine verdere stappen uit om te voorkomen dat bufferoverschrijdingen aan de clientzijde worden uitgevoerd vanwege geretourneerde gegevens. Deze faciliteit heet Mini Compute Conformance Protection (MCCP).
Wanneer de client een aanwijzer doorgeeft aan een bestaande buffer aan een [uit] of [in,] parameter, worden geretourneerde gegevens voor die parameter gekopieerd naar de bestaande buffer. Als de geretourneerde gegevens groter zijn dan de doorgegeven buffer, kan er een bufferoverschrijding optreden wanneer RPC de geretourneerde gegevens kopieert naar de te kleine buffer. Zie Top-Level en ingesloten aanwijzers.
Met MCCP probeert RPC deze voorwaarde te detecteren en de aanroep te weigeren als deze wordt gedetecteerd. Voor buffers met een correlatiewaarde, zoals [size_is], wordt de aanroep geweigerd en wordt RPC_X_BAD_STUB_DATA uitzondering gegenereerd als de geretourneerde gegevens niet in de opgegeven buffergrootte passen. Voor niet-aangepaste tekenreeksen wordt de aanroep geweigerd als de bestaande tekenreeksgrootte (lengte totdat de null- afsluiter) onvoldoende is om de geretourneerde tekenreeks vast te houden, wordt de aanroep geweigerd. RPC kan bufferoverschrijdingen in alle omstandigheden niet detecteren, dus de ontwikkelaar wordt geadviseerd om normale voorzorgsmaatregelen te blijven nemen tegen bufferoverschrijdingen.
Als de client geen bestaande buffer doorgeeft voor een parameter [out], maar in plaats daarvan een deductieaanwijzer doorgeeft aan NULL-, volgt RPC normale regels om namens de client een nieuwe buffer toe te wijzen. Deze buffer wordt toegewezen met voldoende ruimte om de geretourneerde gegevens op te slaan.
Een tweede beveiliging is dat RPC voor gecorreleerde parameters afdwingt dat een niet-null- buffer wordt doorgegeven wanneer de correlatietellingsvariabele niet-null-is.
HRESULT PassString( [in] DWORD Length, [in, unique, string, size_is( Length )]LPWSTR MyString );
Als MyString-NULL-is, weigert RPC de aanroep, tenzij Lengte is ingesteld op 0. Houd er rekening mee dat Lengte 0 is terwijl MyString- niet-NULL-is en RPC MyString- behandelt als een buffertoewijzing van 0 lengte.