Nikolay Sivov (@nsivov) commented about dlls/mf/sac.c:
- if (FAILED(hr = IMMDeviceCollection_GetCount(devices, &count)))
goto done;
- sources = CoTaskMemAlloc(count * sizeof(*sources));
- for (i = 0; i < count; ++i)
- {
WCHAR symbolic_link[256];
IPropertyStore *ps;
IMMDevice *device;
PROPVARIANT pv;
WCHAR *str;
if (FAILED(hr = create_activation_object(NULL, &audio_capture_activate_funcs, &sources[i])))
goto done;
++created_count;
IMFActivate_SetGUID(sources[i], &MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, &MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID);
To handle failures in individual Set methods we have things like mediatype_set_guid() in mfplat, that take &hr argument to set error code appropriately without introducing more cleanup conditions.