oleaut32/tests: Fix safearray leaks, test return value after array destruction.
This commit is contained in:
parent
7ee7f0843b
commit
a5582d77cf
|
@ -219,9 +219,11 @@ static void check_for_VT_INT_PTR(void)
|
|||
bound.lLbound = 0;
|
||||
a = SafeArrayCreate(VT_INT_PTR, 1, &bound);
|
||||
if (a) {
|
||||
HRESULT hres;
|
||||
trace("VT_INT_PTR is supported\n");
|
||||
HAVE_OLEAUT32_INT_PTR = TRUE;
|
||||
SafeArrayDestroy(a);
|
||||
hres = SafeArrayDestroy(a);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
else {
|
||||
trace("VT_INT_PTR is not supported\n");
|
||||
|
@ -944,7 +946,8 @@ test_LockUnlock_Vector:
|
|||
bVector ? "vector " : "\n", count, hres);
|
||||
}
|
||||
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
if (bVector == FALSE && pSafeArrayCreateVector)
|
||||
|
@ -1079,7 +1082,8 @@ static void test_SafeArrayGetPutElement(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
static void test_SafeArrayGetPutElement_BSTR(void)
|
||||
|
@ -1113,7 +1117,8 @@ static void test_SafeArrayGetPutElement_BSTR(void)
|
|||
ok(hres == S_OK, "Failed to get bstr element at hres 0x%x\n", hres);
|
||||
if (hres == S_OK)
|
||||
ok(SysStringLen(value) == SysStringLen(gotvalue), "Got len %d instead of %d\n", SysStringLen(gotvalue), SysStringLen(value));
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
SysFreeString(value);
|
||||
SysFreeString(gotvalue);
|
||||
}
|
||||
|
@ -1174,7 +1179,8 @@ static void test_SafeArrayGetPutElement_IUnknown(void)
|
|||
ok(hres == S_OK, "Failed to get bstr element at hres 0x%x\n", hres);
|
||||
if (hres == S_OK)
|
||||
ok(value == gotvalue, "Got %p instead of %p\n", gotvalue, value);
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
ok(tunk_xref == 2,"Failed to decrement refcount of iface.\n");
|
||||
}
|
||||
|
||||
|
@ -1208,7 +1214,8 @@ static void test_SafeArrayRedim_IUnknown(void)
|
|||
hres = SafeArrayRedim(sa, &sab);
|
||||
ok(hres == S_OK, "Failed to shrink array hres 0x%x\n", hres);
|
||||
ok(tunk_xref == 1, "Failed to decrement refcount\n");
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
static void test_SafeArrayGetPutElement_VARIANT(void)
|
||||
|
@ -1248,7 +1255,8 @@ static void test_SafeArrayGetPutElement_VARIANT(void)
|
|||
if (V_VT(&value) == V_VT(&gotvalue))
|
||||
ok(V_I4(&value) == V_I4(&gotvalue), "Got %d instead of %d\n", V_I4(&value), V_VT(&gotvalue));
|
||||
}
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1323,7 +1331,8 @@ static void test_SafeArrayCopyData(void)
|
|||
ok(hres == E_INVALIDARG, "Smaller copy last dimension hres 0x%x\n", hres);
|
||||
sacopy->rgsabound[3].cElements += 1;
|
||||
|
||||
SafeArrayDestroy(sacopy);
|
||||
hres = SafeArrayDestroy(sacopy);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
sacopy = NULL;
|
||||
hres = pSafeArrayCopyData(sa, sacopy);
|
||||
ok(hres == E_INVALIDARG, "->Null copy hres 0x%x\n", hres);
|
||||
|
@ -1335,10 +1344,12 @@ static void test_SafeArrayCopyData(void)
|
|||
ok(SafeArrayGetElemsize(sa) == SafeArrayGetElemsize(sacopy),"elemsize wrong\n");
|
||||
ok(SafeArrayGetDim(sa) == SafeArrayGetDim(sacopy),"dimensions wrong\n");
|
||||
ok(!memcmp(sa->pvData, sacopy->pvData, size * sizeof(int)), "compared different\n");
|
||||
SafeArrayDestroy(sacopy);
|
||||
hres = SafeArrayDestroy(sacopy);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
static void test_SafeArrayCreateEx(void)
|
||||
|
@ -1391,7 +1402,8 @@ static void test_SafeArrayCreateEx(void)
|
|||
ok(hres == S_OK && IsEqualGUID(&guid, &IID_IUnknown), "Set bad IID\n");
|
||||
}
|
||||
}
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
sa = pSafeArrayCreateEx(VT_DISPATCH, 1, sab, NULL);
|
||||
|
@ -1409,7 +1421,8 @@ static void test_SafeArrayCreateEx(void)
|
|||
ok(IsEqualGUID(&guid, &IID_IDispatch), "CreateEx (NULL) bad IID\n");
|
||||
}
|
||||
}
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
sa = pSafeArrayCreateEx(VT_UNKNOWN, 1, sab, NULL);
|
||||
|
@ -1427,7 +1440,8 @@ static void test_SafeArrayCreateEx(void)
|
|||
ok(IsEqualGUID(&guid, &IID_IUnknown), "CreateEx (NULL-Unk) bad IID\n");
|
||||
}
|
||||
}
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
/* VT_RECORD failure case */
|
||||
|
@ -1446,7 +1460,8 @@ static void test_SafeArrayCreateEx(void)
|
|||
if (sa)
|
||||
{
|
||||
ok(sa->cbElements == RECORD_SIZE_FAIL, "Altered size to %d\n", sa->cbElements);
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
ok(iRec->clearCalled == sab[0].cElements, "Destroy->Clear called %d times\n", iRec->clearCalled);
|
||||
}
|
||||
|
||||
|
@ -1473,13 +1488,19 @@ static void test_SafeArrayCreateEx(void)
|
|||
|
||||
ok(sa->cbElements == RECORD_SIZE,"Elemsize is %d\n", sa->cbElements);
|
||||
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
ok(iRec->sizeCalled == 1, "Destroy->GetSize called %d times\n", iRec->sizeCalled);
|
||||
ok(iRec->clearCalled == sab[0].cElements, "Destroy->Clear called %d times\n", iRec->clearCalled);
|
||||
ok(iRec->ref == START_REF_COUNT, "Wrong iRec refcount %d\n", iRec->ref);
|
||||
}
|
||||
else
|
||||
SafeArrayDestroy(sa);
|
||||
{
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
IRecordInfo_Release(&iRec->IRecordInfo_iface);
|
||||
}
|
||||
|
||||
static void test_SafeArrayClear(void)
|
||||
|
@ -1518,7 +1539,8 @@ static void test_SafeArrayClear(void)
|
|||
hres = VariantClear(&v);
|
||||
ok(hres == DISP_E_BADVARTYPE, "VariantClear: hres 0x%x\n", hres);
|
||||
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
static void test_SafeArrayCopy(void)
|
||||
|
@ -1554,8 +1576,10 @@ static void test_SafeArrayCopy(void)
|
|||
"VariantCopy: hres 0x%x, Type %d\n", hres, V_VT(&vDst));
|
||||
ok(V_ARRAY(&vDst) != sa, "VariantClear: Performed shallow copy\n");
|
||||
|
||||
SafeArrayDestroy(V_ARRAY(&vSrc));
|
||||
SafeArrayDestroy(V_ARRAY(&vDst));
|
||||
hres = SafeArrayDestroy(V_ARRAY(&vSrc));
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
hres = SafeArrayDestroy(V_ARRAY(&vDst));
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
|
||||
hres = SafeArrayAllocDescriptor(1, &sa);
|
||||
ok(hres == S_OK, "SafeArrayAllocDescriptor failed with error 0x%08x\n", hres);
|
||||
|
@ -1568,8 +1592,10 @@ static void test_SafeArrayCopy(void)
|
|||
hres = SafeArrayCopy(sa, &sa2);
|
||||
ok(hres == S_OK, "SafeArrayCopy failed with error 0x%08x\n", hres);
|
||||
|
||||
SafeArrayDestroy(sa2);
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa2);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
#define MKARRAY(low,num,typ) sab.lLbound = low; sab.cElements = num; \
|
||||
|
@ -1605,7 +1631,8 @@ static void test_SafeArrayChangeTypeEx(void)
|
|||
}
|
||||
|
||||
/* VT_VECTOR|VT_UI1 -> VT_BSTR */
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
if (pSafeArrayCreateVector)
|
||||
{
|
||||
sa = pSafeArrayCreateVector(VT_UI1, 0, strlen(szHello)+1);
|
||||
|
@ -1640,7 +1667,15 @@ static void test_SafeArrayChangeTypeEx(void)
|
|||
if (vt == VT_UI1)
|
||||
continue;
|
||||
|
||||
MKARRAYCONT(0,1,vt);
|
||||
sab.lLbound = 0;
|
||||
sab.cElements = 1;
|
||||
sa = SafeArrayCreate(vt, 1, &sab);
|
||||
if (!sa) continue;
|
||||
|
||||
V_VT(&v) = VT_ARRAY|vt;
|
||||
V_ARRAY(&v) = sa;
|
||||
VariantInit(&v2);
|
||||
|
||||
hres = VariantChangeTypeEx(&v2, &v, 0, 0, VT_BSTR);
|
||||
ok(hres != S_OK, "CTE VT_ARRAY|VT %d->BSTR succeeded\n", vt);
|
||||
VariantClear(&v2);
|
||||
|
@ -1663,7 +1698,8 @@ static void test_SafeArrayChangeTypeEx(void)
|
|||
ok(hres == DISP_E_TYPEMISMATCH, "CTE VT_ARRAY|VT_UI1->VT_ARRAY|VT_I1 returned %x\n", hres);
|
||||
|
||||
/* But can change to the same array type */
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
sa = pSafeArrayCreateVector(VT_UI1, 0, 1);
|
||||
ok(sa != NULL, "CreateVector() failed.\n");
|
||||
if (!sa)
|
||||
|
@ -1672,7 +1708,8 @@ static void test_SafeArrayChangeTypeEx(void)
|
|||
V_ARRAY(&v) = sa;
|
||||
hres = VariantChangeTypeEx(&v2, &v, 0, 0, VT_ARRAY|VT_UI1);
|
||||
ok(hres == S_OK, "CTE VT_ARRAY|VT_UI1->VT_ARRAY|VT_UI1 returned %x\n", hres);
|
||||
SafeArrayDestroy(sa);
|
||||
hres = SafeArrayDestroy(sa);
|
||||
ok(hres == S_OK, "got 0x%08x\n", hres);
|
||||
VariantClear(&v2);
|
||||
}
|
||||
|
||||
|
|
|
@ -1099,6 +1099,7 @@ static void test_typelibmarshal(void)
|
|||
ok(V_VT(&varresult) == VT_BSTR, "Return value should be of type BSTR instead of %d\n", V_VT(&varresult));
|
||||
ok(!lstrcmpW(V_BSTR(&varresult), szTestTest), "Return value should have been \"TestTest\" instead of %s\n", wine_dbgstr_w(V_BSTR(&varresult)));
|
||||
VariantClear(&varresult);
|
||||
SysFreeString(bstr);
|
||||
|
||||
/* call SetOleColor with large negative VT_I4 param */
|
||||
VariantInit(&vararg[0]);
|
||||
|
|
|
@ -256,6 +256,7 @@ static void test_marshal_LPSAFEARRAY(void)
|
|||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE);
|
||||
next = LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
ok(next - buffer == expected, "Marshaled %u bytes, expected %u\n", (ULONG) (next - buffer), expected);
|
||||
ok(lpsa->cLocks == 7, "got lock count %u\n", lpsa->cLocks);
|
||||
|
||||
check_safearray(buffer, lpsa);
|
||||
|
||||
|
@ -268,12 +269,14 @@ static void test_marshal_LPSAFEARRAY(void)
|
|||
SafeArrayGetVartype(lpsa, &vt);
|
||||
SafeArrayGetVartype(lpsa2, &vt2);
|
||||
ok(vt == vt2, "vts differ %x %x\n", vt, vt2);
|
||||
todo_wine ok(lpsa2->cLocks == 0, "got lock count %u, expected 0\n", lpsa2->cLocks);
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE);
|
||||
LPSAFEARRAY_UserFree(&umcb.Flags, &lpsa2);
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
lpsa->cLocks = 0;
|
||||
SafeArrayDestroy(lpsa);
|
||||
hr = SafeArrayDestroy(lpsa);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
/* use two dimensions */
|
||||
sab[0].lLbound = 5;
|
||||
|
@ -300,6 +303,7 @@ static void test_marshal_LPSAFEARRAY(void)
|
|||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE);
|
||||
next = LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
ok(next - buffer == expected, "Marshaled %u bytes, expected %u\n", (ULONG) (next - buffer), expected);
|
||||
ok(lpsa->cLocks == 7, "got lock count %u\n", lpsa->cLocks);
|
||||
|
||||
check_safearray(buffer, lpsa);
|
||||
|
||||
|
@ -312,12 +316,14 @@ static void test_marshal_LPSAFEARRAY(void)
|
|||
SafeArrayGetVartype(lpsa, &vt);
|
||||
SafeArrayGetVartype(lpsa2, &vt2);
|
||||
ok(vt == vt2, "vts differ %x %x\n", vt, vt2);
|
||||
todo_wine ok(lpsa2->cLocks == 0, "got lock count %u, expected 0\n", lpsa2->cLocks);
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE);
|
||||
LPSAFEARRAY_UserFree(&umcb.Flags, &lpsa2);
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
lpsa->cLocks = 0;
|
||||
SafeArrayDestroy(lpsa);
|
||||
hr = SafeArrayDestroy(lpsa);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
/* test NULL safe array */
|
||||
lpsa = NULL;
|
||||
|
@ -371,7 +377,8 @@ static void test_marshal_LPSAFEARRAY(void)
|
|||
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
lpsa->cLocks = 0;
|
||||
SafeArrayDestroy(lpsa);
|
||||
hr = SafeArrayDestroy(lpsa);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
/* VARTYPE-less arrays can be marshaled if cbElements is 1,2,4 or 8 as type SF_In */
|
||||
hr = SafeArrayAllocDescriptor(1, &lpsa);
|
||||
|
@ -398,8 +405,10 @@ static void test_marshal_LPSAFEARRAY(void)
|
|||
"Marshaled %u bytes, expected %u\n", (ULONG) (next - buffer), expected);
|
||||
check_safearray(buffer, lpsa);
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
SafeArrayDestroyData(lpsa);
|
||||
SafeArrayDestroyDescriptor(lpsa);
|
||||
hr = SafeArrayDestroyData(lpsa);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
hr = SafeArrayDestroyDescriptor(lpsa);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
/* Test an array of VT_BSTR */
|
||||
sab[0].lLbound = 3;
|
||||
|
@ -479,7 +488,8 @@ static void test_marshal_LPSAFEARRAY(void)
|
|||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
SafeArrayDestroy(lpsa);
|
||||
hr = SafeArrayDestroy(lpsa);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
/* VARTYPE-less arrays with FADF_VARIANT */
|
||||
hr = SafeArrayAllocDescriptor(1, &lpsa);
|
||||
|
@ -509,8 +519,10 @@ static void test_marshal_LPSAFEARRAY(void)
|
|||
lpsa->cbElements = 16; /* VARIANT wire size */
|
||||
check_safearray(buffer, lpsa);
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
SafeArrayDestroyData(lpsa);
|
||||
SafeArrayDestroyDescriptor(lpsa);
|
||||
hr = SafeArrayDestroyData(lpsa);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
hr = SafeArrayDestroyDescriptor(lpsa);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
}
|
||||
|
||||
static void check_bstr(void *buffer, BSTR b)
|
||||
|
@ -765,6 +777,7 @@ static void test_marshal_VARIANT(void)
|
|||
DECIMAL dec, dec2;
|
||||
HeapUnknown *heap_unknown;
|
||||
DWORD expected;
|
||||
HRESULT hr;
|
||||
|
||||
stubMsg.RpcMsg = &rpcMsg;
|
||||
|
||||
|
@ -1394,7 +1407,8 @@ static void test_marshal_VARIANT(void)
|
|||
VARIANT_UserFree(&umcb.Flags, &v2);
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, oldbuffer);
|
||||
SafeArrayDestroy(lpsa);
|
||||
hr = SafeArrayDestroy(lpsa);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
/*** VARIANT BYREF ***/
|
||||
VariantInit(&v);
|
||||
|
|
Loading…
Reference in New Issue