From: David Kahurani k.kahurani@gmail.com
Signed-off-by: David Kahurani k.kahurani@gmail.com --- dlls/msi/database.c | 20 +++++++++++++++++--- dlls/msi/tests/db.c | 9 ++++++++- 2 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/dlls/msi/database.c b/dlls/msi/database.c index 548a66c22ab..8308ab81f3a 100644 --- a/dlls/msi/database.c +++ b/dlls/msi/database.c @@ -890,7 +890,7 @@ end:
static UINT export_field( HANDLE handle, MSIRECORD *row, UINT field ) { - char *buffer; + char *buffer, *tmp; BOOL ret; DWORD sz = 0x100; UINT r; @@ -902,8 +902,6 @@ static UINT export_field( HANDLE handle, MSIRECORD *row, UINT field ) r = MSI_RecordGetStringA( row, field, buffer, &sz ); if (r == ERROR_MORE_DATA) { - char *tmp; - sz++; /* leave room for NULL terminator */ tmp = realloc( buffer, sz ); if (!tmp) @@ -926,6 +924,22 @@ static UINT export_field( HANDLE handle, MSIRECORD *row, UINT field ) return r; }
+ tmp = buffer; + while( *tmp ) + { + if (*tmp == '\r' && *( tmp + 1 ) == '\n') + { + *tmp++ = '\x11'; + *tmp++ = '\x19'; + continue; + } + + if (*tmp == '\n') + *tmp = 0; + + tmp++; + } + ret = WriteFile( handle, buffer, sz, &sz, NULL ); free( buffer ); return ret ? ERROR_SUCCESS : ERROR_FUNCTION_FAILED; diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index 29b8d45e25a..dd7eb0c7d54 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -8590,6 +8590,7 @@ static void test_embedded_nulls(void) "s72\tL0\n" "Control\tDialog\n" "LicenseAgreementDlg\ttext\x11\x19te\nxt\0text"; + char *data[sizeof(control_table)];; UINT r; DWORD sz; MSIHANDLE hdb, hrec; @@ -8599,7 +8600,7 @@ static void test_embedded_nulls(void) ok( r == ERROR_SUCCESS, "failed to open database %u\n", r );
GetCurrentDirectoryA( MAX_PATH, CURR_DIR ); - write_file( "temp_file", control_table, sizeof(control_table) ); + write_file( "temp_file", control_table, strlen(control_table) ); r = MsiDatabaseImportA( hdb, CURR_DIR, "temp_file" ); ok( r == ERROR_SUCCESS, "failed to import table %u\n", r ); DeleteFileA( "temp_file" ); @@ -8613,6 +8614,12 @@ static void test_embedded_nulls(void) ok( r == ERROR_SUCCESS, "failed to get string %u\n", r ); ok( !memcmp( "text\r\ntext\ntext", buffer, sizeof("text\r\ntext\ntext") - 1 ), "wrong buffer contents "%s"\n", buffer );
+ r = MsiDatabaseExportA( hdb, "Control", CURR_DIR, "temp_file1"); + ok( r == ERROR_SUCCESS, "failed to export table %u\n", r ); + read_file_data( "temp_file1", data ); + ok( !memcmp( data, control_table, sizeof(control_table) ), "wrong file contents "%s" vs "%s"\n", control_table, data ); + DeleteFileA( "temp_file1" ); + MsiCloseHandle( hrec ); MsiCloseHandle( hdb ); DeleteFileA( msifile );