MSI: fix MsiRecordSetString for NULL strings and update test case

Mike McCormack mike at codeweavers.com
Tue Jan 25 09:56:37 CST 2005


Thanks to Aric for spotting this.

ChangeLog:
* fix MsiRecordSetString for NULL strings and update test case
-------------- next part --------------
Index: dlls/msi/record.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/record.c,v
retrieving revision 1.19
diff -u -p -r1.19 record.c
--- dlls/msi/record.c	9 Jan 2005 18:24:15 -0000	1.19
+++ dlls/msi/record.c	25 Jan 2005 15:55:48 -0000
@@ -454,12 +454,20 @@ UINT MSI_RecordSetStringA( MSIRECORD *re
     if( iField > rec->count )
         return ERROR_INVALID_FIELD;
 
-    len = MultiByteToWideChar( CP_ACP, 0, szValue, -1, NULL, 0 );
-    str = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
-    MultiByteToWideChar( CP_ACP, 0, szValue, -1, str, len );
     MSI_FreeField( &rec->fields[iField] );
-    rec->fields[iField].type = MSIFIELD_WSTR;
-    rec->fields[iField].u.szwVal = str;
+    if( szValue )
+    {
+        len = MultiByteToWideChar( CP_ACP, 0, szValue, -1, NULL, 0 );
+        str = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
+        MultiByteToWideChar( CP_ACP, 0, szValue, -1, str, len );
+        rec->fields[iField].type = MSIFIELD_WSTR;
+        rec->fields[iField].u.szwVal = str;
+    }
+    else
+    {
+        rec->fields[iField].type = MSIFIELD_NULL;
+        rec->fields[iField].u.szwVal = NULL;
+    }
 
     return 0;
 }
@@ -491,13 +499,22 @@ UINT MSI_RecordSetStringW( MSIRECORD *re
     if( iField > rec->count )
         return ERROR_INVALID_FIELD;
 
-    len = lstrlenW(szValue) + 1;
-    str = HeapAlloc( GetProcessHeap(), 0, len*sizeof (WCHAR));
-    lstrcpyW( str, szValue );
-
     MSI_FreeField( &rec->fields[iField] );
-    rec->fields[iField].type = MSIFIELD_WSTR;
-    rec->fields[iField].u.szwVal = str;
+
+    if( szValue )
+    {
+        len = lstrlenW(szValue) + 1;
+        str = HeapAlloc( GetProcessHeap(), 0, len*sizeof (WCHAR));
+        lstrcpyW( str, szValue );
+
+        rec->fields[iField].type = MSIFIELD_WSTR;
+        rec->fields[iField].u.szwVal = str;
+    }
+    else
+    {
+        rec->fields[iField].type = MSIFIELD_NULL;
+        rec->fields[iField].u.szwVal = NULL;
+    }
 
     return 0;
 }
Index: dlls/msi/tests/record.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/tests/record.c,v
retrieving revision 1.3
diff -u -p -r1.3 record.c
--- dlls/msi/tests/record.c	10 Jan 2005 13:29:24 -0000	1.3
+++ dlls/msi/tests/record.c	25 Jan 2005 15:55:48 -0000
@@ -119,6 +119,10 @@ void test_msirecord(void)
     ok(r == 1, "failed to get integer\n");
 
     /* same record, but add a string to it */
+    r = MsiRecordSetString(h, 0, NULL);
+    ok(r == ERROR_SUCCESS, "Failed to set null string at 0\n");
+    r = MsiRecordIsNull(h, 0);
+    ok(r == TRUE, "null string not null field\n");
     r = MsiRecordSetString(h,0,str);
     ok(r == ERROR_SUCCESS, "Failed to set string at 0\n");
     r = MsiRecordGetInteger(h, 0);


More information about the wine-patches mailing list