Make IPropertBag_Read use a dynamically allocated array rather than a

static one.
oldstable
Robert Shearman 2003-08-05 19:19:21 +00:00 committed by Alexandre Julliard
parent d8b2109e61
commit 4a55eb5c92
1 changed files with 40 additions and 22 deletions

View File

@ -94,8 +94,8 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
VARIANT* pVar,
IErrorLog* pErrorLog)
{
WCHAR wszData[MAX_PATH + 1];
LONG received = MAX_PATH + 1;
LPVOID pData = NULL;
LONG received;
DWORD type = 0;
ICOM_THIS(RegPropBagImpl, iface);
HRESULT res = S_OK;
@ -106,13 +106,24 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
if (!pszPropName || !pVar)
return E_POINTER;
/* work around a GCC bug that occurs here unless we use the reswin32 variable as well */
reswin32 = RegQueryValueExW(This->hkey, pszPropName, NULL, &type, (LPVOID)wszData, &received);
reswin32 = RegQueryValueExW(This->hkey, pszPropName, NULL, NULL, NULL, &received);
res = HRESULT_FROM_WIN32(reswin32);
if (SUCCEEDED(res))
{
TRACE("%ld, %s\n", received, debugstr_w(wszData));
pData = HeapAlloc(GetProcessHeap(), 0, received);
/* work around a GCC bug that occurs here unless we use the reswin32 variable as well */
reswin32 = RegQueryValueExW(This->hkey, pszPropName, NULL, &type, pData, &received);
res = HRESULT_FROM_WIN32(reswin32);
}
if (SUCCEEDED(res))
{
res = E_INVALIDARG; /* assume we cannot coerce into right type */
TRACE("Read %ld bytes (%s)\n", received, type == REG_SZ ? debugstr_w((LPWSTR)pData) : "binary data");
switch (type)
{
case REG_SZ:
@ -120,18 +131,20 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
{
case VT_LPWSTR:
V_UNION(pVar, bstrVal) = CoTaskMemAlloc(received * sizeof(WCHAR));
strcpyW(V_UNION(pVar, bstrVal), wszData);
return S_OK;
strcpyW(V_UNION(pVar, bstrVal), (LPWSTR)pData);
res = S_OK;
break;
case VT_EMPTY:
V_VT(pVar) = VT_BSTR;
/* fall through */
case VT_BSTR:
V_UNION(pVar, bstrVal) = SysAllocStringLen(wszData, received - 1);
return S_OK;
V_UNION(pVar, bstrVal) = SysAllocStringLen((LPWSTR)pData, received - 1);
res = S_OK;
break;
}
break;
case REG_DWORD:
TRACE("REG_DWORD: %lx\n", *(DWORD *)wszData);
TRACE("REG_DWORD: %lx\n", *(DWORD *)pData);
switch (V_VT(pVar))
{
case VT_EMPTY:
@ -139,8 +152,9 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
/* fall through */
case VT_I4:
case VT_UI4:
V_UNION(pVar, ulVal) = *(DWORD *)wszData;
return S_OK;
V_UNION(pVar, ulVal) = *(DWORD *)pData;
res = S_OK;
break;
}
break;
case REG_BINARY:
@ -155,26 +169,30 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
case VT_EMPTY:
case VT_ARRAY | VT_UI1:
if (!(V_UNION(pVar, parray) = SafeArrayCreate(VT_UI1, 1, &bound)))
return E_OUTOFMEMORY;
res = E_OUTOFMEMORY;
res = S_OK;
break;
}
if (res == E_INVALIDARG)
break;
res = SafeArrayAccessData(V_UNION(pVar, parray), &pArrayElements);
if (FAILED(res))
{
TRACE(" <- %lx\n", res);
return res;
}
CopyMemory(pArrayElements, wszData, received);
break;
CopyMemory(pArrayElements, pData, received);
res = SafeArrayUnaccessData(V_UNION(pVar, parray));
TRACE(" <- %lx\n", res);
return res;
break;
}
}
FIXME("Variant type %x not supported for regtype %lx\n", V_VT(pVar), type);
return E_FAIL;
if (res == E_INVALIDARG)
FIXME("Variant type %x not supported for regtype %lx\n", V_VT(pVar), type);
}
if (pData)
HeapFree(GetProcessHeap(), 0, pData);
TRACE("<- %lx\n", res);
return res;
}