Bagikan melalui


Perlindungan Buffer MCCP

Dimulai dengan Windows Vista, RPC Marshalling Engine mengambil langkah-langkah lebih lanjut untuk mencoba mencegah overrun buffer sisi klien karena data yang dikembalikan. Fasilitas ini disebut Mini Compute Conformance Protection (MCCP).

Ketika klien meneruskan pointer ke buffer yang ada ke parameter [out] atau [in,out], data yang dikembalikan untuk parameter tersebut disalin ke buffer yang ada. Jika data yang dikembalikan lebih besar dari buffer yang dilewatkan, overrun buffer dapat terjadi ketika RPC menyalin data yang dikembalikan ke dalam buffer yang terlalu kecil. Lihat Penunjuk Tingkat Atas dan Tersemat.

Dengan MCCP, RPC mencoba mendeteksi kondisi ini dan menolak panggilan jika terdeteksi. Untuk buffer dengan nilai korelasi, seperti [size_is], jika data yang dikembalikan tidak sesuai dengan ukuran buffer yang ditentukan, panggilan ditolak dan pengecualian RPC_X_BAD_STUB_DATA dinaikkan. Untuk string yang tidak berukuran, panggilan ditolak jika ukuran string yang ada (panjang hingga terminator null ) tidak cukup untuk menahan string yang dikembalikan, panggilan ditolak. RPC tidak dapat mendeteksi overrun buffer dalam semua kondisi, sehingga pengembang disarankan untuk terus mengambil tindakan pencegahan normal terhadap overrun buffer.

Jika klien tidak meneruskan buffer yang ada untuk parameter [out], tetapi sebaliknya meneruskan penunjuk dereferensi ke NULL, RPC akan mengikuti aturan normal untuk mengalokasikan buffer baru atas nama klien. Buffer ini akan dialokasikan dengan ruang yang cukup untuk menyimpan data yang dikembalikan.

Perlindungan kedua adalah bahwa untuk parameter berkorelasi, RPC akan memberlakukan bahwa buffer non-null diteruskan ketika variabel jumlah korelasi bukan null.

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

Jika MyStringNULL, RPC akan menolak panggilan kecuali Panjang diatur ke 0. Perhatikan bahwa RPC akan memungkinkan Length menjadi 0 sementara MyStringnon-NULL, dan RPC akan memperlakukan MyString sebagai alokasi buffer panjang 0.