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