CQGAVssProvider implements three COM interfaces, each with its own
IUnknown base subobject. Returning the complete object address for
IID_IUnknown relies on IVssSoftwareSnapshotProvider remaining the first
base class.

Return the IVssSoftwareSnapshotProvider subobject instead. This selects
the canonical IUnknown identity without relying on the complete-object
layout.

Signed-off-by: Marc-André Lureau <[email protected]>
---
 qga/vss-win32/provider.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/qga/vss-win32/provider.cpp b/qga/vss-win32/provider.cpp
index 377571b94881..44c3c74bd2f2 100644
--- a/qga/vss-win32/provider.cpp
+++ b/qga/vss-win32/provider.cpp
@@ -212,7 +212,8 @@ CQGAVssProvider::~CQGAVssProvider()
 STDMETHODIMP CQGAVssProvider::QueryInterface(REFIID riid, void **ppObj)
 {
     if (riid == IID_IUnknown) {
-        *ppObj = static_cast<void*>(this);
+        *ppObj = static_cast<void*>(
+            static_cast<IVssSoftwareSnapshotProvider*>(this));
         AddRef();
         return S_OK;
     }

-- 
2.55.0.543.g5ebe2ebe4ea8


Reply via email to