MCCP 버퍼 보호
Windows Vista부터 RPC 마샬링 엔진은 반환된 데이터로 인해 클라이언트 쪽 버퍼 오버런을 방지하기 위해 추가 단계를 수행합니다. 이 기능을 MCCP(Mini Compute Conformance Protection)라고 합니다.
클라이언트가 기존 버퍼에 대한 포인터를 [out] 또는 [in,out] 매개 변수에 전달하면 해당 매개 변수에 대해 반환된 데이터가 기존 버퍼에 복사됩니다. 반환된 데이터가 전달된 버퍼보다 크면 RPC가 반환된 데이터를 너무 작은 버퍼에 복사할 때 버퍼 오버런이 발생할 수 있습니다. 최상위 및 포함된 포인터를 참조하세요.
MCCP를 사용하면 RPC는 이 조건을 검색하고 검색된 경우 호출을 거부하려고 시도합니다. [size_is]과 같은 상관 관계 값이 있는 버퍼의 경우 반환된 데이터가 지정된 버퍼 크기에 맞지 않으면 호출이 거부되고 RPC_X_BAD_STUB_DATA 예외가 발생합니다. 크기가 조정되지 않은 문자열의 경우 기존 문자열 크기( null 종결자까지 길이)가 반환된 문자열을 보유하기에 충분하지 않으면 호출이 거부됩니다. RPC는 모든 조건에서 버퍼 오버런을 감지할 수 없으므로 개발자는 버퍼 오버런에 대해 정상적인 예방 조치를 계속 수행하는 것이 좋습니다.
클라이언트가 [out] 매개 변수에 대한 기존 버퍼를 전달하지 않고 대신 역참조 포인터를 NULL에 전달하는 경우 RPC는 일반 규칙을 따라 클라이언트 대신 새 버퍼를 할당합니다. 이 버퍼는 반환된 데이터를 저장할 수 있는 충분한 공간으로 할당됩니다.
두 번째 보호는 상관 관계 매개 변수의 경우 RPC는 상관 관계 개수 변수가 null이 아닌 경우 null이 아닌 버퍼가 전달되도록 적용합니다.
HRESULT PassString( [in] DWORD Length, [in, unique, string, size_is( Length )]LPWSTR MyString );
MyString이 NULL인 경우 길이가 0으로 설정되지 않는 한 RPC는 호출을 거부합니다. MyString이 NULL이 아닌 경우 RPC는 길이를 0으로 허용하고 RPC는 MyString을 0 길이 버퍼 할당으로 처리합니다.