https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0b125236c6cb7c8ec7a6d8ea926647c997967931

commit 0b125236c6cb7c8ec7a6d8ea926647c997967931
Author:     winesync <[email protected]>
AuthorDate: Sat Mar 12 15:12:15 2022 +0100
Commit:     Mark Jansen <[email protected]>
CommitDate: Sun Mar 20 19:27:45 2022 +0100

    [WINESYNC] msi: Avoid using awstring in MsiFormatRecordW().
    
    Signed-off-by: Zebediah Figura <[email protected]>
    Signed-off-by: Hans Leidekker <[email protected]>
    Signed-off-by: Alexandre Julliard <[email protected]>
    
    wine commit id 6b54a4bc2eadd0b5cbc2553e2969ff572ff042d1 by Zebediah Figura 
<[email protected]>
---
 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);

Reply via email to