[PATCH] mfplat/tests: Avoid crash by async cancel callback in linux.
Bernhard Übelacker
bernhardu at mailbox.org
Sun Dec 12 09:50:18 CST 2021
Signed-off-by: Bernhard Übelacker <bernhardu at mailbox.org>
---
The cancel in test_scheduled_items puts a work item to the
queue by invoke_async_callback.
But when this work item is processed the function test_scheduled_items
is possibly already left, and the stack memory overwritten by
the next test.
This testbot run tried to force the crash by invalidating the callback:
https://testbot.winehq.org/JobDetails.pl?Key=103981
---
dlls/mfplat/tests/mfplat.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 4dfdc18bb52..d1664e81031 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -2933,19 +2933,24 @@ static void test_MFHeapAlloc(void)
MFHeapFree(res);
}
+/* Documentation for MFCancelWorkItem mentions that the callback
+ might still be called, even when MFCancelWorkItem is left.
+ In Wine implementation the cancel queues a work item
+ via invoke_async_callback which needs the callback later. */
+static struct test_callback scheduled_items_callback;
+
static void test_scheduled_items(void)
{
- struct test_callback callback;
IMFAsyncResult *result;
MFWORKITEM_KEY key, key2;
HRESULT hr;
- init_test_callback(&callback);
+ init_test_callback(&scheduled_items_callback);
hr = MFStartup(MF_VERSION, MFSTARTUP_FULL);
ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr);
- hr = MFScheduleWorkItem(&callback.IMFAsyncCallback_iface, NULL, -5000, &key);
+ hr = MFScheduleWorkItem(&scheduled_items_callback.IMFAsyncCallback_iface, NULL, -5000, &key);
ok(hr == S_OK, "Failed to schedule item, hr %#x.\n", hr);
hr = MFCancelWorkItem(key);
@@ -2960,7 +2965,7 @@ static void test_scheduled_items(void)
return;
}
- hr = MFCreateAsyncResult(NULL, &callback.IMFAsyncCallback_iface, NULL, &result);
+ hr = MFCreateAsyncResult(NULL, &scheduled_items_callback.IMFAsyncCallback_iface, NULL, &result);
ok(hr == S_OK, "Failed to create result, hr %#x.\n", hr);
hr = pMFPutWaitingWorkItem(NULL, 0, result, &key);
@@ -2977,7 +2982,7 @@ static void test_scheduled_items(void)
IMFAsyncResult_Release(result);
- hr = MFScheduleWorkItem(&callback.IMFAsyncCallback_iface, NULL, -5000, &key);
+ hr = MFScheduleWorkItem(&scheduled_items_callback.IMFAsyncCallback_iface, NULL, -5000, &key);
ok(hr == S_OK, "Failed to schedule item, hr %#x.\n", hr);
hr = MFCancelWorkItem(key);
--
2.33.0
More information about the wine-devel
mailing list