[PATCH 1/2] ieframe: Simplify IPersist_Load, make error handling more straightforward (Coverity)
Nikolay Sivov
nsivov at codeweavers.com
Fri Apr 8 14:56:52 CDT 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/ieframe/intshcut.c | 179 +++++++++++++++++++++---------------------------
1 file changed, 79 insertions(+), 100 deletions(-)
diff --git a/dlls/ieframe/intshcut.c b/dlls/ieframe/intshcut.c
index 19b253d..385b059 100644
--- a/dlls/ieframe/intshcut.c
+++ b/dlls/ieframe/intshcut.c
@@ -420,135 +420,114 @@ static HRESULT WINAPI PersistFile_IsDirty(IPersistFile *pFile)
return This->isDirty ? S_OK : S_FALSE;
}
-/* A helper function: Allocate and fill rString. Return number of bytes read. */
-static DWORD get_profile_string(LPCWSTR lpAppName, LPCWSTR lpKeyName,
+/* Returns allocated profile string and a standard return code. */
+static HRESULT get_profile_string(LPCWSTR lpAppName, LPCWSTR lpKeyName,
LPCWSTR lpFileName, WCHAR **rString )
{
DWORD r = 0;
DWORD len = 128;
WCHAR *buffer;
+ *rString = NULL;
buffer = CoTaskMemAlloc(len * sizeof(*buffer));
- if (buffer != NULL)
- {
- r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, buffer, len, lpFileName);
- while (r == len-1)
- {
- WCHAR *realloc_buf;
+ if (!buffer)
+ return E_OUTOFMEMORY;
- len *= 2;
- realloc_buf = CoTaskMemRealloc(buffer, len * sizeof(*buffer));
- if (realloc_buf == NULL)
- {
- CoTaskMemFree(buffer);
- *rString = NULL;
- return 0;
- }
- buffer = realloc_buf;
+ r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, buffer, len, lpFileName);
+ while (r == len-1)
+ {
+ WCHAR *realloc_buf;
- r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, buffer, len, lpFileName);
+ len *= 2;
+ realloc_buf = CoTaskMemRealloc(buffer, len * sizeof(*buffer));
+ if (realloc_buf == NULL)
+ {
+ CoTaskMemFree(buffer);
+ return E_OUTOFMEMORY;
}
+ buffer = realloc_buf;
+
+ r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, buffer, len, lpFileName);
}
*rString = buffer;
- return r;
+ return r ? S_OK : E_FAIL;
}
static HRESULT WINAPI PersistFile_Load(IPersistFile *pFile, LPCOLESTR pszFileName, DWORD dwMode)
{
- WCHAR str_header[] = {'I','n','t','e','r','n','e','t','S','h','o','r','t','c','u','t',0};
- WCHAR str_URL[] = {'U','R','L',0};
- WCHAR str_iconfile[] = {'i','c','o','n','f','i','l','e',0};
- WCHAR str_iconindex[] = {'i','c','o','n','i','n','d','e','x',0};
+ InternetShortcut *This = impl_from_IPersistFile(pFile);
+ static WCHAR str_header[] = {'I','n','t','e','r','n','e','t','S','h','o','r','t','c','u','t',0};
+ static WCHAR str_URL[] = {'U','R','L',0};
+ static WCHAR str_iconfile[] = {'i','c','o','n','f','i','l','e',0};
+ static WCHAR str_iconindex[] = {'i','c','o','n','i','n','d','e','x',0};
WCHAR *filename = NULL;
+ WCHAR *url;
HRESULT hr;
- InternetShortcut *This = impl_from_IPersistFile(pFile);
+ IPropertyStorage *pPropStg;
+ WCHAR *iconfile;
+ WCHAR *iconindexstring;
+
TRACE("(%p, %s, 0x%x)\n", pFile, debugstr_w(pszFileName), dwMode);
+
if (dwMode != 0)
FIXME("ignoring unimplemented mode 0x%x\n", dwMode);
+
filename = co_strdupW(pszFileName);
- if (filename != NULL)
- {
- DWORD r;
- WCHAR *url;
+ if (!filename)
+ return E_OUTOFMEMORY;
- r = get_profile_string(str_header, str_URL, pszFileName, &url);
+ if (FAILED(hr = get_profile_string(str_header, str_URL, pszFileName, &url)))
+ {
+ CoTaskMemFree(filename);
+ return hr;
+ }
- if (url == NULL)
- {
- hr = E_OUTOFMEMORY;
- CoTaskMemFree(filename);
- }
- else if (r == 0)
- {
- hr = E_FAIL;
- CoTaskMemFree(filename);
- }
- else
- {
- hr = S_OK;
- CoTaskMemFree(This->currentFile);
- This->currentFile = filename;
- CoTaskMemFree(This->url);
- This->url = url;
- This->isDirty = FALSE;
- }
+ CoTaskMemFree(This->currentFile);
+ This->currentFile = filename;
+ CoTaskMemFree(This->url);
+ This->url = url;
+ This->isDirty = FALSE;
- /* Now we're going to read in the iconfile and iconindex.
- If we don't find them, that's not a failure case -- it's possible
- that they just aren't in there. */
- if (SUCCEEDED(hr))
- {
- IPropertyStorage *pPropStg;
- WCHAR *iconfile;
- WCHAR *iconindexstring;
- hr = IPropertySetStorage_Open(This->property_set_storage, &FMTID_Intshcut,
- STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
- &pPropStg);
-
- if (get_profile_string(str_header, str_iconfile, pszFileName, &iconfile))
- {
- PROPSPEC ps;
- PROPVARIANT pv;
- ps.ulKind = PRSPEC_PROPID;
- ps.u.propid = PID_IS_ICONFILE;
- pv.vt = VT_LPWSTR;
- pv.u.pwszVal = iconfile;
- hr = IPropertyStorage_WriteMultiple(pPropStg, 1, &ps, &pv, 0);
- if (FAILED(hr))
- {
- TRACE("Failed to store the iconfile to our property storage. hr = 0x%x\n", hr);
- }
- }
- CoTaskMemFree(iconfile);
+ /* Now we're going to read in the iconfile and iconindex.
+ If we don't find them, that's not a failure case -- it's possible
+ that they just aren't in there. */
+ hr = IPropertySetStorage_Open(This->property_set_storage, &FMTID_Intshcut,
+ STGM_READWRITE | STGM_SHARE_EXCLUSIVE, &pPropStg);
- if (get_profile_string(str_header, str_iconindex, pszFileName, &iconindexstring))
- {
- int iconindex;
- PROPSPEC ps;
- PROPVARIANT pv;
- char *iconindexastring = co_strdupWtoA(iconindexstring);
- sscanf(iconindexastring, "%d", &iconindex);
- CoTaskMemFree(iconindexastring);
- ps.ulKind = PRSPEC_PROPID;
- ps.u.propid = PID_IS_ICONINDEX;
- pv.vt = VT_I4;
- pv.u.iVal = iconindex;
- hr = IPropertyStorage_WriteMultiple(pPropStg, 1, &ps, &pv, 0);
- if (FAILED(hr))
- {
- TRACE("Failed to store the iconindex to our property storage. hr = 0x%x\n", hr);
- }
- }
- CoTaskMemFree(iconindexstring);
+ if (get_profile_string(str_header, str_iconfile, pszFileName, &iconfile) == S_OK)
+ {
+ PROPSPEC ps;
+ PROPVARIANT pv;
+ ps.ulKind = PRSPEC_PROPID;
+ ps.u.propid = PID_IS_ICONFILE;
+ pv.vt = VT_LPWSTR;
+ pv.u.pwszVal = iconfile;
+ hr = IPropertyStorage_WriteMultiple(pPropStg, 1, &ps, &pv, 0);
+ if (FAILED(hr))
+ TRACE("Failed to store the iconfile to our property storage. hr = 0x%x\n", hr);
+ }
+ CoTaskMemFree(iconfile);
- IPropertyStorage_Release(pPropStg);
- }
- else
- hr = E_OUTOFMEMORY;
+ if (get_profile_string(str_header, str_iconindex, pszFileName, &iconindexstring) == S_OK)
+ {
+ int iconindex;
+ PROPSPEC ps;
+ PROPVARIANT pv;
+ char *iconindexastring = co_strdupWtoA(iconindexstring);
+ sscanf(iconindexastring, "%d", &iconindex);
+ CoTaskMemFree(iconindexastring);
+ ps.ulKind = PRSPEC_PROPID;
+ ps.u.propid = PID_IS_ICONINDEX;
+ pv.vt = VT_I4;
+ pv.u.iVal = iconindex;
+ hr = IPropertyStorage_WriteMultiple(pPropStg, 1, &ps, &pv, 0);
+ if (FAILED(hr))
+ TRACE("Failed to store the iconindex to our property storage. hr = 0x%x\n", hr);
}
- else
- hr = E_OUTOFMEMORY;
+ CoTaskMemFree(iconindexstring);
+
+ IPropertyStorage_Release(pPropStg);
return hr;
}
--
2.8.0.rc3
More information about the wine-patches
mailing list