[PATCH] ole32: Support BIND_OPTS3 in bind context.

Nikolay Sivov nsivov at codeweavers.com
Sun Nov 3 14:58:58 CST 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/ole32/bindctx.c       | 38 +++++++++++++++-----------------------
 dlls/ole32/tests/moniker.c | 13 ++++++++-----
 2 files changed, 23 insertions(+), 28 deletions(-)

diff --git a/dlls/ole32/bindctx.c b/dlls/ole32/bindctx.c
index 1951100b0b..24229568f1 100644
--- a/dlls/ole32/bindctx.c
+++ b/dlls/ole32/bindctx.c
@@ -57,7 +57,7 @@ typedef struct BindCtxImpl{
     DWORD          bindCtxTableLastIndex;  /* first free index in the table */
     DWORD          bindCtxTableSize;   /* size table */
 
-    BIND_OPTS2 bindOption2; /* a structure which contains the bind options*/
+    BIND_OPTS3 options;
 
 } BindCtxImpl;
 
@@ -246,17 +246,17 @@ BindCtxImpl_SetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts)
 {
     BindCtxImpl *This = impl_from_IBindCtx(iface);
 
-    TRACE("(%p,%p)\n",This,pbindopts);
+    TRACE("(%p,%p)\n",This, pbindopts);
 
     if (pbindopts==NULL)
         return E_POINTER;
 
-    if (pbindopts->cbStruct > sizeof(BIND_OPTS2))
+    if (pbindopts->cbStruct > sizeof(This->options))
     {
-        WARN("invalid size\n");
-        return E_INVALIDARG; /* FIXME : not verified */
+        WARN("invalid size %u.\n", pbindopts->cbStruct);
+        return E_INVALIDARG;
     }
-    memcpy(&This->bindOption2, pbindopts, pbindopts->cbStruct);
+    memcpy(&This->options, pbindopts, pbindopts->cbStruct);
     return S_OK;
 }
 
@@ -267,19 +267,16 @@ static HRESULT WINAPI
 BindCtxImpl_GetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts)
 {
     BindCtxImpl *This = impl_from_IBindCtx(iface);
-    ULONG cbStruct;
+    DWORD size;
 
     TRACE("(%p,%p)\n",This,pbindopts);
 
     if (pbindopts==NULL)
         return E_POINTER;
 
-    cbStruct = pbindopts->cbStruct;
-    if (cbStruct > sizeof(BIND_OPTS2))
-        cbStruct = sizeof(BIND_OPTS2);
-
-    memcpy(pbindopts, &This->bindOption2, cbStruct);
-    pbindopts->cbStruct = cbStruct;
+    size = min(pbindopts->cbStruct, sizeof(This->options));
+    memcpy(pbindopts, &This->options, size);
+    pbindopts->cbStruct = size;
 
     return S_OK;
 }
@@ -520,16 +517,11 @@ static HRESULT BindCtxImpl_Construct(BindCtxImpl* This)
     This->IBindCtx_iface.lpVtbl = &VT_BindCtxImpl;
     This->ref          = 0;
 
-    /* Initialize the BIND_OPTS2 structure */
-    This->bindOption2.cbStruct  = sizeof(BIND_OPTS2);
-    This->bindOption2.grfFlags = 0;
-    This->bindOption2.grfMode = STGM_READWRITE;
-    This->bindOption2.dwTickCountDeadline = 0;
-
-    This->bindOption2.dwTrackFlags = 0;
-    This->bindOption2.dwClassContext = CLSCTX_SERVER;
-    This->bindOption2.locale = GetThreadLocale();
-    This->bindOption2.pServerInfo = 0;
+    memset(&This->options, 0, sizeof(This->options));
+    This->options.cbStruct = sizeof(This->options);
+    This->options.grfMode = STGM_READWRITE;
+    This->options.dwClassContext = CLSCTX_SERVER;
+    This->options.locale = GetThreadLocale();
 
     /* Initialize the bindctx table */
     This->bindCtxTableSize=0;
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index 5bcc136a36..18ea4d465b 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -1888,7 +1888,7 @@ static void test_bind_context(void)
     HRESULT hr;
     IBindCtx *pBindCtx;
     IEnumString *pEnumString;
-    BIND_OPTS2 bind_opts;
+    BIND_OPTS3 bind_opts;
     HeapUnknown *unknown;
     HeapUnknown *unknown2;
     IUnknown *param_obj;
@@ -1908,19 +1908,20 @@ static void test_bind_context(void)
     bind_opts.cbStruct = -1;
     hr = IBindCtx_GetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts);
     ok_ole_success(hr, "IBindCtx_GetBindOptions");
-    ok(bind_opts.cbStruct == sizeof(bind_opts) ||
-       bind_opts.cbStruct == sizeof(bind_opts) + sizeof(void*), /* Vista */
-       "bind_opts.cbStruct was %d\n", bind_opts.cbStruct);
+    ok(bind_opts.cbStruct == sizeof(BIND_OPTS3) || broken(bind_opts.cbStruct == sizeof(BIND_OPTS2)) /* XP */,
+        "Unexpected bind_opts.cbStruct %d.\n", bind_opts.cbStruct);
 
     bind_opts.cbStruct = sizeof(BIND_OPTS);
     hr = IBindCtx_GetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts);
     ok_ole_success(hr, "IBindCtx_GetBindOptions");
     ok(bind_opts.cbStruct == sizeof(BIND_OPTS), "bind_opts.cbStruct was %d\n", bind_opts.cbStruct);
 
+    memset(&bind_opts, 0xfe, sizeof(bind_opts));
     bind_opts.cbStruct = sizeof(bind_opts);
     hr = IBindCtx_GetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts);
     ok_ole_success(hr, "IBindCtx_GetBindOptions");
-    ok(bind_opts.cbStruct == sizeof(bind_opts), "bind_opts.cbStruct was %d\n", bind_opts.cbStruct);
+    ok(bind_opts.cbStruct == sizeof(bind_opts) || bind_opts.cbStruct == sizeof(BIND_OPTS2) /* XP */,
+        "Unexpected bind_opts.cbStruct %d.\n", bind_opts.cbStruct);
     ok(bind_opts.grfFlags == 0, "bind_opts.grfFlags was 0x%x instead of 0\n", bind_opts.grfFlags);
     ok(bind_opts.grfMode == STGM_READWRITE, "bind_opts.grfMode was 0x%x instead of STGM_READWRITE\n", bind_opts.grfMode);
     ok(bind_opts.dwTickCountDeadline == 0, "bind_opts.dwTickCountDeadline was %d instead of 0\n", bind_opts.dwTickCountDeadline);
@@ -1929,6 +1930,8 @@ static void test_bind_context(void)
         "bind_opts.dwClassContext should have been 0x15 instead of 0x%x\n", bind_opts.dwClassContext);
     ok(bind_opts.locale == GetThreadLocale(), "bind_opts.locale should have been 0x%x instead of 0x%x\n", GetThreadLocale(), bind_opts.locale);
     ok(bind_opts.pServerInfo == NULL, "bind_opts.pServerInfo should have been NULL instead of %p\n", bind_opts.pServerInfo);
+    if (bind_opts.cbStruct >= sizeof(BIND_OPTS3))
+        ok(bind_opts.hwnd == NULL, "Unexpected bind_opts.hwnd %p.\n", bind_opts.hwnd);
 
     bind_opts.cbStruct = -1;
     hr = IBindCtx_SetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts);
-- 
2.24.0.rc1




More information about the wine-devel mailing list