From 5efb3ea42df3ae01df065a93ae88ec04095a71ed Mon Sep 17 00:00:00 2001 From: jp9000 Date: Mon, 25 Jul 2022 12:07:03 -0700 Subject: [PATCH] virtualcam-module: Only allow DLL unload when filter freed Fixes a bug where the DLL could unload while the filter is currently being destroyed, which would cause a crash in the host process --- plugins/win-dshow/virtualcam-module/virtualcam-filter.cpp | 4 ++++ plugins/win-dshow/virtualcam-module/virtualcam-module.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/win-dshow/virtualcam-module/virtualcam-filter.cpp b/plugins/win-dshow/virtualcam-module/virtualcam-filter.cpp index b8c25a5d6..20bde29a9 100644 --- a/plugins/win-dshow/virtualcam-module/virtualcam-filter.cpp +++ b/plugins/win-dshow/virtualcam-module/virtualcam-filter.cpp @@ -10,6 +10,7 @@ using namespace DShow; extern bool initialize_placeholder(); extern const uint8_t *get_placeholder_ptr(); extern const bool get_placeholder_size(int *out_cx, int *out_cy); +extern volatile long locks; /* ========================================================================= */ @@ -107,6 +108,7 @@ VCamFilter::VCamFilter() th = std::thread([this] { Thread(); }); AddRef(); + InterlockedIncrement(&locks); } VCamFilter::~VCamFilter() @@ -118,6 +120,8 @@ VCamFilter::~VCamFilter() if (placeholder.scaled_data) free(placeholder.scaled_data); + + InterlockedDecrement(&locks); } const wchar_t *VCamFilter::FilterName() const diff --git a/plugins/win-dshow/virtualcam-module/virtualcam-module.cpp b/plugins/win-dshow/virtualcam-module/virtualcam-module.cpp index a0d501326..cdc8e72c6 100644 --- a/plugins/win-dshow/virtualcam-module/virtualcam-module.cpp +++ b/plugins/win-dshow/virtualcam-module/virtualcam-module.cpp @@ -11,7 +11,7 @@ static const REGFILTERPINS AMSPinVideo = {L"Output", false, true, nullptr, 1, &AMSMediaTypesV}; HINSTANCE dll_inst = nullptr; -static volatile long locks = 0; +volatile long locks = 0; /* ========================================================================= */