Protection de la mémoire tampon MCCP
À compter de Windows Vista, le moteur de marshaling RPC prend des mesures supplémentaires pour tenter d’empêcher les dépassements de mémoire tampon côté client en raison des données retournées. Cette fonctionnalité est appelée Mini Compute Conformance Protection (MCCP).
Lorsque le client transmet un pointeur vers une mémoire tampon existante vers un paramètre [out] ou [in,out], les données retournées pour ce paramètre sont copiées dans la mémoire tampon existante. Si les données retournées sont supérieures à la mémoire tampon passée, un dépassement de mémoire tampon peut se produire lorsque RPC copie les données retournées dans la mémoire tampon trop petite. Consultez Pointeurs de niveau supérieur et incorporés.
Avec MCCP, RPC tente de détecter cette condition et de rejeter l’appel s’il est détecté. Pour les mémoires tampons avec une valeur de corrélation, telle que [size_is], si les données retournées ne correspondent pas à la taille de mémoire tampon spécifiée, l’appel est rejeté et RPC_X_BAD_STUB_DATA exception est levée. Pour les chaînes non volumineuses, l’appel est rejeté si la taille de chaîne existante (longueur jusqu’à la fin null ) est insuffisante pour contenir la chaîne retournée, l’appel est rejeté. RPC ne peut pas détecter les dépassements de mémoire tampon dans toutes les conditions. Il est donc recommandé au développeur de continuer à prendre des précautions normales contre les dépassements de mémoire tampon.
Si le client ne passe pas de mémoire tampon existante pour un paramètre [out], mais transmet à la place un pointeur déréférencement vers NULL, RPC suit les règles normales pour allouer une nouvelle mémoire tampon pour le compte du client. Cette mémoire tampon sera allouée avec suffisamment d’espace pour contenir les données retournées.
Une deuxième protection est que pour les paramètres corrélés, RPC applique qu’une mémoire tampon non null est passée lorsque la variable de nombre de corrélations n’est pas null.
HRESULT PassString( [in] DWORD Length, [in, unique, string, size_is( Length )]LPWSTR MyString );
Si MyString a la valeur NULL, RPC rejette l’appel, sauf si Longueur est définie sur 0. Notez que RPC permet à Length d’être 0 alors que MyString n’a pas la valeur NULL, et RPC traite MyString comme une allocation de mémoire tampon de longueur 0.