SafeArrayGetElement on a VARIANT array does not free the previous
VARIANT in the passed pointer. Added testcase.
This commit is contained in:
parent
36420ef44a
commit
a6584f5eed
|
@ -342,7 +342,9 @@ static HRESULT SAFEARRAY_DestroyData(SAFEARRAY *psa, ULONG ulStartCell)
|
||||||
|
|
||||||
while(ulCellCount--)
|
while(ulCellCount--)
|
||||||
{
|
{
|
||||||
VariantClear(lpVariant);
|
HRESULT hRet = VariantClear(lpVariant);
|
||||||
|
|
||||||
|
if (FAILED(hRet)) FIXME("VariantClear of element failed!\n");
|
||||||
lpVariant++;
|
lpVariant++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,7 +371,10 @@ static HRESULT SAFEARRAY_CopyData(SAFEARRAY *psa, SAFEARRAY *dest)
|
||||||
|
|
||||||
while(ulCellCount--)
|
while(ulCellCount--)
|
||||||
{
|
{
|
||||||
VariantCopy(lpDest, lpVariant);
|
HRESULT hRet;
|
||||||
|
|
||||||
|
hRet = VariantCopy(lpDest, lpVariant);
|
||||||
|
if (FAILED(hRet)) FIXME("VariantCopy failed with 0x%lx\n", hRet);
|
||||||
lpVariant++;
|
lpVariant++;
|
||||||
lpDest++;
|
lpDest++;
|
||||||
}
|
}
|
||||||
|
@ -874,8 +879,10 @@ HRESULT WINAPI SafeArrayPutElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData
|
||||||
VARIANT* lpVariant = (VARIANT*)pvData;
|
VARIANT* lpVariant = (VARIANT*)pvData;
|
||||||
VARIANT* lpDest = (VARIANT*)lpvDest;
|
VARIANT* lpDest = (VARIANT*)lpvDest;
|
||||||
|
|
||||||
VariantClear(lpDest);
|
hRet = VariantClear(lpDest);
|
||||||
VariantCopy(lpDest, lpVariant);
|
if (FAILED(hRet)) FIXME("VariantClear failed with 0x%lx\n", hRet);
|
||||||
|
hRet = VariantCopy(lpDest, lpVariant);
|
||||||
|
if (FAILED(hRet)) FIXME("VariantCopy failed with 0x%lx\n", hRet);
|
||||||
}
|
}
|
||||||
else if (psa->fFeatures & FADF_BSTR)
|
else if (psa->fFeatures & FADF_BSTR)
|
||||||
{
|
{
|
||||||
|
@ -959,7 +966,10 @@ HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData
|
||||||
VARIANT* lpVariant = (VARIANT*)lpvSrc;
|
VARIANT* lpVariant = (VARIANT*)lpvSrc;
|
||||||
VARIANT* lpDest = (VARIANT*)pvData;
|
VARIANT* lpDest = (VARIANT*)pvData;
|
||||||
|
|
||||||
VariantCopy(lpDest, lpVariant);
|
/* The original content of pvData is ignored. */
|
||||||
|
V_VT(lpDest) = VT_EMPTY;
|
||||||
|
hRet = VariantCopy(lpDest, lpVariant);
|
||||||
|
if (FAILED(hRet)) FIXME("VariantCopy failed with 0x%lx\n", hRet);
|
||||||
}
|
}
|
||||||
else if (psa->fFeatures & FADF_BSTR)
|
else if (psa->fFeatures & FADF_BSTR)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1087,6 +1087,47 @@ static void test_SafeArrayGetPutElement_IUnknown(void)
|
||||||
ok(tunk_xref == 2,"Failed to decrement refcount of iface.\n");
|
ok(tunk_xref == 2,"Failed to decrement refcount of iface.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_SafeArrayGetPutElement_VARIANT(void)
|
||||||
|
{
|
||||||
|
SAFEARRAYBOUND sab;
|
||||||
|
LONG indices[1];
|
||||||
|
SAFEARRAY *sa;
|
||||||
|
HRESULT hres;
|
||||||
|
VARIANT value, gotvalue;
|
||||||
|
|
||||||
|
sab.lLbound = 1;
|
||||||
|
sab.cElements = 1;
|
||||||
|
sa = SafeArrayCreate(VT_VARIANT, 1, &sab);
|
||||||
|
ok(sa != NULL, "VARIANT test couldn't create array\n");
|
||||||
|
if (!sa)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ok(sa->cbElements == sizeof(VARIANT), "VARIANT size mismatch\n");
|
||||||
|
if (sa->cbElements != sizeof(VARIANT))
|
||||||
|
return;
|
||||||
|
|
||||||
|
indices[0] = sab.lLbound;
|
||||||
|
V_VT(&value) = VT_I4;
|
||||||
|
V_I4(&value) = 0x42424242;
|
||||||
|
hres = SafeArrayPutElement(sa, indices, &value);
|
||||||
|
ok(hres == S_OK, "Failed to put Variant I4 element hres 0x%lx\n", hres);
|
||||||
|
|
||||||
|
V_VT(&gotvalue) = 0xdead;
|
||||||
|
hres = SafeArrayGetElement(sa, indices, &gotvalue);
|
||||||
|
ok(hres == S_OK, "Failed to get variant element at hres 0x%lx\n", hres);
|
||||||
|
|
||||||
|
V_VT(&gotvalue) = VT_EMPTY;
|
||||||
|
hres = SafeArrayGetElement(sa, indices, &gotvalue);
|
||||||
|
ok(hres == S_OK, "Failed to get variant element at hres 0x%lx\n", hres);
|
||||||
|
if (hres == S_OK) {
|
||||||
|
ok(V_VT(&value) == V_VT(&gotvalue), "Got type 0x%x instead of 0x%x\n", V_VT(&value), V_VT(&gotvalue));
|
||||||
|
if (V_VT(&value) == V_VT(&gotvalue))
|
||||||
|
ok(V_I4(&value) == V_I4(&gotvalue), "Got %ld instead of %d\n", V_I4(&value), V_VT(&gotvalue));
|
||||||
|
}
|
||||||
|
SafeArrayDestroy(sa);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void test_SafeArrayCopyData(void)
|
static void test_SafeArrayCopyData(void)
|
||||||
{
|
{
|
||||||
SAFEARRAYBOUND sab[4];
|
SAFEARRAYBOUND sab[4];
|
||||||
|
@ -1520,4 +1561,5 @@ START_TEST(safearray)
|
||||||
test_SafeArrayGetPutElement();
|
test_SafeArrayGetPutElement();
|
||||||
test_SafeArrayGetPutElement_BSTR();
|
test_SafeArrayGetPutElement_BSTR();
|
||||||
test_SafeArrayGetPutElement_IUnknown();
|
test_SafeArrayGetPutElement_IUnknown();
|
||||||
|
test_SafeArrayGetPutElement_VARIANT();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue