Udostępnij za pośrednictwem


Ochrona buforu MCCP

Począwszy od systemu Windows Vista, aparat RPC Marshalling podejmuje dalsze kroki, aby zapobiec przepełnieniu buforu po stronie klienta z powodu zwracanych danych. Ta funkcja nosi nazwę Mini Compute Conformance Protection (MCCP).

Gdy klient przekazuje wskaźnik do istniejącego buforu do parametru [out] lub [w,się] parametr, zwracane dane dla tego parametru są kopiowane do istniejącego buforu. Jeśli zwrócone dane są większe niż przekazany bufor, przekroczenie buforu może wystąpić, gdy RPC kopiuje zwrócone dane do zbyt małego buforu. Zobacz Top-Level i osadzone wskaźniki.

W przypadku programu MCCP RPC próbuje wykryć ten warunek i odrzucić wywołanie, jeśli zostanie wykryte. W przypadku z wartością korelacji, takich jak [size_is], jeśli zwrócone dane nie mieszczą się w określonym rozmiarze buforu, wywołanie zostanie odrzucone i zostanie zgłoszony wyjątek RPC_X_BAD_STUB_DATA. W przypadku niezwymiarowych ciągów wywołanie jest odrzucane, jeśli istniejący rozmiar ciągu (długość do momentu, aż zakończenia) nie będzie niewystarczające do przechowywania zwracanego ciągu, wywołanie zostanie odrzucone. RPC nie może wykryć przepełnień buforu we wszystkich warunkach, dlatego deweloper zaleca dalsze podjęcie normalnych środków ostrożności przed przekroczeniami buforu.

Jeśli klient nie przekaże istniejącego buforu dla parametru [out], ale zamiast tego przekazuje wskaźnik wyłudzonych do null, RPC będzie przestrzegać normalnych reguł przydzielania nowego buforu w imieniu klienta. Ten bufor zostanie przydzielony z wystarczającą ilością miejsca do przechowywania zwracanych danych.

Druga ochrona polega na tym, że w przypadku skorelowanych parametrów RPC wymusi, że bufor o wartości nullnie jest przekazywany, gdy zmienna licznika korelacji nie jestnull.

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

Jeśli MyString ma wartość null , wywołanie wywołania zostanie odrzucone, chyba że długości ma wartość 0. Należy pamiętać, że RPC zezwoli długość na 0, podczas gdy MyString jest inny niżnull, a RPC będzie traktować MyString jako alokację buforu o długości 0.