Aracılığıyla paylaş


MCCP Arabellek Koruması

Windows Vista'dan başlayarak RPC Marshalling Altyapısı, döndürülen veriler nedeniyle istemci tarafı arabellek taşmalarını önlemeye çalışmak için daha fazla adım atar. Bu tesis Mini İşlem Uyumluluğu Koruması (MCCP) olarak adlandırılır.

İstemci var olan bir arabelleğe [] veya [] parametresine bir işaretçi geçirdiğinde, bu parametre için döndürülen veriler var olan arabelleğe kopyalanır. Döndürülen veriler geçirilen arabellekten büyükse, RPC döndürülen verileri çok küçük arabelleğe kopyaladığında arabellek taşması oluşabilir. Bkz. Top-Level ve Eklenmiş İşaretçiler.

MCCP ile RPC bu durumu algılamaya çalışır ve algılanırsa çağrıyı reddeder. [size_is] gibi bir bağıntı değerine sahip arabellekler için, döndürülen veriler belirtilen arabellek boyutuna sığmazsa çağrı reddedilir ve RPC_X_BAD_STUB_DATA özel durum oluşturulur. Mevcut dize boyutu (null sonlandırıcıya kadar uzunluk) döndürülen dizeyi tutmak için yetersizse, çağrı reddedilir. RPC arabellek taşmalarını her koşulda algılayamaz, bu nedenle geliştiricinin arabellek taşmalarına karşı normal önlemler almaya devam etmesi tavsiye edilir.

İstemci [] parametresi için var olan bir arabelleği geçirmezse, ancak bunun yerine başvurulmayan bir işaretçiyi NULLgeçirirse, RPC istemci adına yeni bir arabellek ayırmak için normal kurallara uyar. Bu arabellek, döndürülen verileri tutmak için yeterli alanla ayrılır.

İkinci koruma, bağıntılı parametreler için, bağıntı sayısı değişkeninullolmadığında RPC'ninolmayan null arabelleğinin geçirilmesini zorunlu kılacağıdır.

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

myString NULL ise, Uzunluk 0 olarak ayarlanmadığı sürece RPC çağrıyı reddeder. MYString nulldeğilken RPC'nin Uzunluğu 0 olmasına izin vereceğini ve RPC'nin MyString 0 uzunluklu bir arabellek ayırma olarak kabul edeceğine dikkat edin.