Alexandre Julliard : msi: Fix handling of buffer sizes in MsiEnumPatchesA and avoid a redundant call to MsiEnumPatchesW .
Alexandre Julliard
julliard at winehq.org
Wed Feb 25 09:22:51 CST 2009
Module: wine
Branch: master
Commit: b4d81f851740cdb782e6a48ff2f74280a6a97fd5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b4d81f851740cdb782e6a48ff2f74280a6a97fd5
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Feb 25 15:04:31 2009 +0100
msi: Fix handling of buffer sizes in MsiEnumPatchesA and avoid a redundant call to MsiEnumPatchesW.
---
dlls/msi/registry.c | 27 +++++++++++----------------
1 files changed, 11 insertions(+), 16 deletions(-)
diff --git a/dlls/msi/registry.c b/dlls/msi/registry.c
index 7f9dcb2..73a36eb 100644
--- a/dlls/msi/registry.c
+++ b/dlls/msi/registry.c
@@ -1983,7 +1983,7 @@ UINT WINAPI MsiEnumPatchesExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
UINT WINAPI MsiEnumPatchesA(LPCSTR szProduct, DWORD iPatchIndex,
LPSTR lpPatchBuf, LPSTR lpTransformsBuf, LPDWORD pcchTransformsBuf)
{
- LPWSTR product, transforms = NULL;
+ LPWSTR product, transforms;
WCHAR patch[GUID_SIZE];
DWORD len;
UINT r;
@@ -1998,12 +1998,8 @@ UINT WINAPI MsiEnumPatchesA(LPCSTR szProduct, DWORD iPatchIndex,
if (!product)
return ERROR_OUTOFMEMORY;
- len = 0;
- r = MsiEnumPatchesW(product, iPatchIndex, patch, patch, &len);
- if (r != ERROR_MORE_DATA)
- goto done;
-
- transforms = msi_alloc(len);
+ len = *pcchTransformsBuf;
+ transforms = msi_alloc( len * sizeof(WCHAR) );
if (!transforms)
{
r = ERROR_OUTOFMEMORY;
@@ -2011,24 +2007,23 @@ UINT WINAPI MsiEnumPatchesA(LPCSTR szProduct, DWORD iPatchIndex,
}
r = MsiEnumPatchesW(product, iPatchIndex, patch, transforms, &len);
- if (r != ERROR_SUCCESS)
+ if (r != ERROR_SUCCESS && r != ERROR_MORE_DATA)
goto done;
WideCharToMultiByte(CP_ACP, 0, patch, -1, lpPatchBuf,
GUID_SIZE, NULL, NULL);
- WideCharToMultiByte(CP_ACP, 0, transforms, -1, lpTransformsBuf,
- *pcchTransformsBuf - 1, NULL, NULL);
+ if (!WideCharToMultiByte(CP_ACP, 0, transforms, -1, lpTransformsBuf,
+ *pcchTransformsBuf, NULL, NULL))
+ r = ERROR_MORE_DATA;
- len = lstrlenW(transforms);
- if (*pcchTransformsBuf < len + 1)
+ if (r == ERROR_MORE_DATA)
{
- r = ERROR_MORE_DATA;
lpTransformsBuf[*pcchTransformsBuf - 1] = '\0';
- *pcchTransformsBuf = len * sizeof(WCHAR);
+ *pcchTransformsBuf = len * 2;
}
else
- *pcchTransformsBuf = len;
+ *pcchTransformsBuf = strlen( lpTransformsBuf );
done:
msi_free(transforms);
@@ -2078,7 +2073,7 @@ UINT WINAPI MsiEnumPatchesW(LPCWSTR szProduct, DWORD iPatchIndex,
if (*pcchTransformsBuf <= lstrlenW(transforms))
{
r = ERROR_MORE_DATA;
- *pcchTransformsBuf = lstrlenW(transforms) * sizeof(WCHAR);
+ *pcchTransformsBuf = lstrlenW(transforms);
}
else
*pcchTransformsBuf = lstrlenW(transforms);
More information about the wine-cvs
mailing list