An attempt to copy Media Foundation attribute collection to itself results in a deadlock. Well, it’s not a good idea and a practical one to do a nonsense like this, but the implementation should be resistant to such use either, esp. avoiding the unexpected deadlock.
#include "stdafx.h"
#include <mfapi.h>
#pragma comment(lib, "mfplat.lib")
#pragma comment(lib, "mfuuid.lib")
int main()
{
_ATLTRY
{
ATLENSURE_SUCCEEDED(MFStartup(MF_VERSION));
CComPtr<IMFAttributes> pAttributes;
ATLENSURE_SUCCEEDED(MFCreateAttributes(&pAttributes, 1));
ATLENSURE_SUCCEEDED(pAttributes->SetGUID(MF_MT_SUBTYPE, GUID_NULL));
ATLENSURE_SUCCEEDED(pAttributes->CopyAllItems(pAttributes)); // <<--- Freeze
}
_ATLCATCHALL()
{
}
return 0;
}
The freeze takes place around SRW locks, that is presumably the implementation attempts to lock the data for reading and then once again for writing immediately afterwards.
ntdll.dll!_NtWaitForAlertByThreadId@8() Unknown
ntdll.dll!RtlAcquireSRWLockExclusive() Unknown
mfplat.dll!CMFAttributesImpl<struct IMFAttributes,class CMFSRWLock>::DeleteAllItems(void) Unknown
mfplat.dll!CMFAttributesImpl<struct IMFAttributes,class CMFSRWLock>::_CloneAllAttributes(struct IMFAttributes *) Unknown
mfplat.dll!CMFAttributesImpl<struct IMFAttributes,class CMFSRWLock>::CopyAllItems(struct IMFAttributes *) Unknown
> MfSample01.exe!main() Line 15 C++