Make IPropertBag_Read use a dynamically allocated array rather than a

static one.
This commit is contained in:
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, VARIANT* pVar,
IErrorLog* pErrorLog) IErrorLog* pErrorLog)
{ {
WCHAR wszData[MAX_PATH + 1]; LPVOID pData = NULL;
LONG received = MAX_PATH + 1; LONG received;
DWORD type = 0; DWORD type = 0;
ICOM_THIS(RegPropBagImpl, iface); ICOM_THIS(RegPropBagImpl, iface);
HRESULT res = S_OK; HRESULT res = S_OK;
@ -106,13 +106,24 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
if (!pszPropName || !pVar) if (!pszPropName || !pVar)
return E_POINTER; 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, NULL, NULL, &received);
reswin32 = RegQueryValueExW(This->hkey, pszPropName, NULL, &type, (LPVOID)wszData, &received);
res = HRESULT_FROM_WIN32(reswin32); res = HRESULT_FROM_WIN32(reswin32);
if (SUCCEEDED(res)) 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) switch (type)
{ {
case REG_SZ: case REG_SZ:
@ -120,18 +131,20 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
{ {
case VT_LPWSTR: case VT_LPWSTR:
V_UNION(pVar, bstrVal) = CoTaskMemAlloc(received * sizeof(WCHAR)); V_UNION(pVar, bstrVal) = CoTaskMemAlloc(received * sizeof(WCHAR));
strcpyW(V_UNION(pVar, bstrVal), wszData); strcpyW(V_UNION(pVar, bstrVal), (LPWSTR)pData);
return S_OK; res = S_OK;
break;
case VT_EMPTY: case VT_EMPTY:
V_VT(pVar) = VT_BSTR; V_VT(pVar) = VT_BSTR;
/* fall through */ /* fall through */
case VT_BSTR: case VT_BSTR:
V_UNION(pVar, bstrVal) = SysAllocStringLen(wszData, received - 1); V_UNION(pVar, bstrVal) = SysAllocStringLen((LPWSTR)pData, received - 1);
return S_OK; res = S_OK;
break;
} }
break; break;
case REG_DWORD: case REG_DWORD:
TRACE("REG_DWORD: %lx\n", *(DWORD *)wszData); TRACE("REG_DWORD: %lx\n", *(DWORD *)pData);
switch (V_VT(pVar)) switch (V_VT(pVar))
{ {
case VT_EMPTY: case VT_EMPTY:
@ -139,8 +152,9 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
/* fall through */ /* fall through */
case VT_I4: case VT_I4:
case VT_UI4: case VT_UI4:
V_UNION(pVar, ulVal) = *(DWORD *)wszData; V_UNION(pVar, ulVal) = *(DWORD *)pData;
return S_OK; res = S_OK;
break;
} }
break; break;
case REG_BINARY: case REG_BINARY:
@ -155,26 +169,30 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
case VT_EMPTY: case VT_EMPTY:
case VT_ARRAY | VT_UI1: case VT_ARRAY | VT_UI1:
if (!(V_UNION(pVar, parray) = SafeArrayCreate(VT_UI1, 1, &bound))) if (!(V_UNION(pVar, parray) = SafeArrayCreate(VT_UI1, 1, &bound)))
return E_OUTOFMEMORY; res = E_OUTOFMEMORY;
res = S_OK;
break; break;
} }
if (res == E_INVALIDARG)
break;
res = SafeArrayAccessData(V_UNION(pVar, parray), &pArrayElements); res = SafeArrayAccessData(V_UNION(pVar, parray), &pArrayElements);
if (FAILED(res)) if (FAILED(res))
{ break;
TRACE(" <- %lx\n", res);
return res; CopyMemory(pArrayElements, pData, received);
}
CopyMemory(pArrayElements, wszData, received);
res = SafeArrayUnaccessData(V_UNION(pVar, parray)); res = SafeArrayUnaccessData(V_UNION(pVar, parray));
TRACE(" <- %lx\n", res); break;
return res;
} }
} }
FIXME("Variant type %x not supported for regtype %lx\n", V_VT(pVar), type); if (res == E_INVALIDARG)
return E_FAIL; FIXME("Variant type %x not supported for regtype %lx\n", V_VT(pVar), type);
} }
if (pData)
HeapFree(GetProcessHeap(), 0, pData);
TRACE("<- %lx\n", res); TRACE("<- %lx\n", res);
return res; return res;
} }