https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0b125236c6cb7c8ec7a6d8...
commit 0b125236c6cb7c8ec7a6d8ea926647c997967931 Author: winesync ros-dev@reactos.org AuthorDate: Sat Mar 12 15:12:15 2022 +0100 Commit: Mark Jansen mark.jansen@reactos.org CommitDate: Sun Mar 20 19:27:45 2022 +0100
[WINESYNC] msi: Avoid using awstring in MsiFormatRecordW().
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
wine commit id 6b54a4bc2eadd0b5cbc2553e2969ff572ff042d1 by Zebediah Figura z.figura12@gmail.com --- dll/win32/msi/format.c | 12 +++--------- dll/win32/msi/install.c | 19 +++++++++++++++++++ dll/win32/msi/msipriv.h | 1 + modules/rostests/winetests/msi/custom.c | 11 +++++++++++ 4 files changed, 34 insertions(+), 9 deletions(-)
diff --git a/dll/win32/msi/format.c b/dll/win32/msi/format.c index 98ee320ce59..6165f0a5dfd 100644 --- a/dll/win32/msi/format.c +++ b/dll/win32/msi/format.c @@ -916,22 +916,16 @@ UINT WINAPI MsiFormatRecordW( MSIHANDLE hInstall, MSIHANDLE hRecord, { LPWSTR value = NULL; MSIHANDLE remote; - awstring wstr;
if ((remote = msi_get_remote(hInstall))) { r = remote_FormatRecord(remote, (struct wire_record *)&record->count, &value); - if (r) - { - midl_user_free(value); - return r; - }
- wstr.unicode = TRUE; - wstr.str.w = szResult; - r = msi_strcpy_to_awstring(value, -1, &wstr, sz); + if (!r) + r = msi_strncpyW(value, -1, szResult, sz);
midl_user_free(value); + msiobj_release(&record->hdr); return r; } } diff --git a/dll/win32/msi/install.c b/dll/win32/msi/install.c index 9ade59804d7..7271763f428 100644 --- a/dll/win32/msi/install.c +++ b/dll/win32/msi/install.c @@ -191,6 +191,25 @@ UINT msi_strncpyWtoA(const WCHAR *str, int lenW, char *buf, DWORD *sz, BOOL remo return r; }
+UINT msi_strncpyW(const WCHAR *str, int len, WCHAR *buf, DWORD *sz) +{ + UINT r = ERROR_SUCCESS; + + if (!sz) + return buf ? ERROR_INVALID_PARAMETER : ERROR_SUCCESS; + + if (len < 0) len = strlenW(str); + if (buf) + memcpy(buf, str, min(len + 1, *sz) * sizeof(WCHAR)); + if (buf && len >= *sz) + { + if (*sz) buf[*sz - 1] = 0; + r = ERROR_MORE_DATA; + } + *sz = len; + return r; +} + const WCHAR *msi_get_target_folder( MSIPACKAGE *package, const WCHAR *name ) { MSIFOLDER *folder = msi_get_loaded_folder( package, name ); diff --git a/dll/win32/msi/msipriv.h b/dll/win32/msi/msipriv.h index a8140bb8cdf..95f46d070a6 100644 --- a/dll/win32/msi/msipriv.h +++ b/dll/win32/msi/msipriv.h @@ -1047,6 +1047,7 @@ extern WCHAR **msi_split_string(const WCHAR *, WCHAR) DECLSPEC_HIDDEN; extern UINT msi_set_original_database_property(MSIDATABASE *, const WCHAR *) DECLSPEC_HIDDEN; extern WCHAR *msi_get_error_message(MSIDATABASE *, int) DECLSPEC_HIDDEN; extern UINT msi_strncpyWtoA(const WCHAR *str, int len, char *buf, DWORD *sz, BOOL remote) DECLSPEC_HIDDEN; +extern UINT msi_strncpyW(const WCHAR *str, int len, WCHAR *buf, DWORD *sz) DECLSPEC_HIDDEN;
/* media */
diff --git a/modules/rostests/winetests/msi/custom.c b/modules/rostests/winetests/msi/custom.c index 320aa6f30e5..723b2b5deba 100644 --- a/modules/rostests/winetests/msi/custom.c +++ b/modules/rostests/winetests/msi/custom.c @@ -815,6 +815,17 @@ static void test_format_record(MSIHANDLE hinst) ok(hinst, !strcmp(buffer, "foo 123"), "got "%s"\n", buffer); ok(hinst, sz == 7, "got size %u\n", sz);
+ r = MsiFormatRecordW(hinst, rec, NULL, NULL); + ok(hinst, !r, "got %u\n", r); + + r = MsiFormatRecordW(hinst, rec, bufferW, NULL); + ok(hinst, r == ERROR_INVALID_PARAMETER, "got %u\n", r); + + sz = 0; + r = MsiFormatRecordW(hinst, rec, NULL, &sz); + ok(hinst, !r, "got %u\n", r); + ok(hinst, sz == 7, "got size %u\n", sz); + sz = 0; bufferW[0] = 'q'; r = MsiFormatRecordW(hinst, rec, bufferW, &sz);