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 | 13 +++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/dlls/msi/database.c b/dlls/msi/database.c index 548a66c22ab..8c99ef677e1 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 = '\x19'; + + 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..e902900322d 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -8584,12 +8584,18 @@ static void test_embedded_nulls(void) "s72\tL0\n" "Control\tDialog\n" "LicenseAgreementDlg\ttext\x11\x19text\0text"; + static const char export_expected[] = + "Dialog\tText\r\n" + "s72\tL0\r\n" + "Control\tDialog\r\n" + "LicenseAgreementDlg\ttext\x11\x19text\x19text"; /* newlines have alternate representation in idt files */ static const char control_table2[] = "Dialog\tText\n" "s72\tL0\n" "Control\tDialog\n" "LicenseAgreementDlg\ttext\x11\x19te\nxt\0text"; + char data[1024]; UINT r; DWORD sz; MSIHANDLE hdb, hrec; @@ -8613,6 +8619,13 @@ 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 ); + /* Ignore last characters, doesn't look like they it matter */ + ok( !memcmp( data, export_expected, sizeof(export_expected) - 1), "expected: "%s" got: "%s"\n", export_expected, data ); + DeleteFileA( "temp_file1" ); + MsiCloseHandle( hrec ); MsiCloseHandle( hdb ); DeleteFileA( msifile );