[PATCH 0/2] MR11046: mfplat: Do not require CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE...
The case where unknown extensions should be rejected is not fixed here because it looks prone to regression. We might not check all necessary extensions. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11046
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/mfplat/tests/Makefile.in | 2 +- dlls/mfplat/tests/mfplat.c | 53 +++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/dlls/mfplat/tests/Makefile.in b/dlls/mfplat/tests/Makefile.in index 217ea437b3c..898420268e3 100644 --- a/dlls/mfplat/tests/Makefile.in +++ b/dlls/mfplat/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = mfplat.dll -IMPORTS = ole32 mfplat user32 d3d9 dxva2 mfuuid propsys uuid strmiids +IMPORTS = ole32 mfplat user32 d3d9 dxva2 mfuuid propsys uuid strmiids kernelbase SOURCES = \ mfplat.c \ diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 22ed97ceea9..aba2f85af61 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -29,6 +29,7 @@ #include "winuser.h" #include "winreg.h" #include "ole2.h" +#include "pathcch.h" #include "ks.h" #include "ksmedia.h" #include "amvideo.h" @@ -272,6 +273,13 @@ static void check_platform_lock_count_(unsigned int line, unsigned int expected) ok_(__FILE__, line)(count == expected, "Unexpected lock count %d.\n", count); } +static void path_copy_replace_filename(WCHAR *dst_path, size_t size, const WCHAR *src_path, const WCHAR *filename) +{ + lstrcpyW(dst_path, src_path); + PathCchRemoveFileSpec(dst_path, size); + PathCchAppend(dst_path, size, filename); +} + struct d3d9_surface_readback { IDirect3DSurface9 *surface, *readback_surface; @@ -1397,6 +1405,49 @@ static void test_source_resolver(void) hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &stream); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + path_copy_replace_filename(pathW, ARRAY_SIZE(pathW), filename, L"noextension"); + + hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, pathW, MF_RESOLUTION_MEDIASOURCE, NULL, + &obj_type, (IUnknown **)&mediasource); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + { + IMFMediaSource_Shutdown(mediasource); + IMFMediaSource_Release(mediasource); + } + IMFByteStream_Release(stream); + + hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &stream); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + path_copy_replace_filename(pathW, ARRAY_SIZE(pathW), filename, L"temp.foo"); + + hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, pathW, MF_RESOLUTION_MEDIASOURCE, NULL, + &obj_type, (IUnknown **)&mediasource); + todo_wine + ok(hr == MF_E_UNSUPPORTED_BYTESTREAM_TYPE, "Unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + { + IMFMediaSource_Shutdown(mediasource); + IMFMediaSource_Release(mediasource); + } + IMFByteStream_Release(stream); + + hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &stream); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, pathW, + MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE, + NULL, &obj_type, (IUnknown **)&mediasource); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFMediaSource_Shutdown(mediasource); + IMFMediaSource_Release(mediasource); + IMFByteStream_Release(stream); + + hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &stream); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFByteStream_QueryInterface(stream, &IID_IMFAttributes, (void **)&attributes); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMFAttributes_SetString(attributes, &MF_BYTESTREAM_CONTENT_TYPE, L"video/mp4"); @@ -1750,6 +1801,8 @@ static void test_source_resolver(void) (void **)&scheme_handler); ok(hr == S_OK, "Failed to create handler object, hr %#lx.\n", hr); + lstrcpyW(pathW, fileschemeW); + lstrcatW(pathW, filename); cancel_cookie = NULL; hr = IMFSchemeHandler_BeginCreateObject(scheme_handler, pathW, MF_RESOLUTION_MEDIASOURCE, NULL, &cancel_cookie, &callback2->IMFAsyncCallback_iface, (IUnknown *)scheme_handler); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11046
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/mfplat/main.c | 2 +- dlls/mfplat/tests/mfplat.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c index 5747b37e35d..f0716cc9abb 100644 --- a/dlls/mfplat/main.c +++ b/dlls/mfplat/main.c @@ -6351,7 +6351,7 @@ static HRESULT resolver_get_bytestream_handler(IMFByteStream *stream, const WCHA if (SUCCEEDED(hr)) return hr; - if (!(flags & MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE)) + if (url_ext && !(flags & MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE)) return MF_E_UNSUPPORTED_BYTESTREAM_TYPE; if (FAILED(hr = resolver_get_bytestream_url_hint(stream, &url_ext))) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index aba2f85af61..24093a5e23d 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -1409,7 +1409,6 @@ static void test_source_resolver(void) hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, pathW, MF_RESOLUTION_MEDIASOURCE, NULL, &obj_type, (IUnknown **)&mediasource); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); if (SUCCEEDED(hr)) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11046
Nikolay Sivov (@nsivov) commented about dlls/mfplat/main.c:
if (SUCCEEDED(hr)) return hr;
- if (!(flags & MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE)) + if (url_ext && !(flags & MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE)) return MF_E_UNSUPPORTED_BYTESTREAM_TYPE;
Shouldn't we do earlier? If have url or mime, and that failed to match, we should probably return right there? So at "`if (url_ext || mimeW)`" condition. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11046#note_142489
On Tue Jun 9 07:56:21 2026 +0000, Nikolay Sivov wrote:
Shouldn't we do earlier? If have url or mime, and that failed to match, we should probably return right there? So at "`if (url_ext || mimeW)`" condition. We need the `CoTaskMemFree()` calls and a check for success. I see nothing to gain from moving it earlier.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/11046#note_142529
participants (3)
-
Conor McCarthy -
Conor McCarthy (@cmccarthy) -
Nikolay Sivov (@nsivov)