From 0d56df214bd88de0ddbe98bc08c95dfb8bece810 Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Mon, 11 Feb 2008 01:15:13 -0600 Subject: [PATCH] msi: Successfully return an empty string when requesting a record index beyond the record's size. --- dlls/msi/record.c | 16 ++++++++++++++-- dlls/msi/tests/record.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/dlls/msi/record.c b/dlls/msi/record.c index 8a69591e3ba..7a9c9e0d8cf 100644 --- a/dlls/msi/record.c +++ b/dlls/msi/record.c @@ -338,7 +338,13 @@ UINT MSI_RecordGetStringA(MSIRECORD *rec, UINT iField, TRACE("%p %d %p %p\n", rec, iField, szValue, pcchValue); if( iField > rec->count ) - return ERROR_INVALID_PARAMETER; + { + if ( szValue && *pcchValue > 0 ) + szValue[0] = 0; + + *pcchValue = 0; + return ERROR_SUCCESS; + } ret = ERROR_SUCCESS; switch( rec->fields[iField].type ) @@ -414,7 +420,13 @@ UINT MSI_RecordGetStringW(MSIRECORD *rec, UINT iField, TRACE("%p %d %p %p\n", rec, iField, szValue, pcchValue); if( iField > rec->count ) - return ERROR_INVALID_PARAMETER; + { + if ( szValue && *pcchValue > 0 ) + szValue[0] = 0; + + *pcchValue = 0; + return ERROR_SUCCESS; + } ret = ERROR_SUCCESS; switch( rec->fields[iField].type ) diff --git a/dlls/msi/tests/record.c b/dlls/msi/tests/record.c index 1f72d128617..471fc9ce372 100644 --- a/dlls/msi/tests/record.c +++ b/dlls/msi/tests/record.c @@ -351,7 +351,35 @@ static void test_msirecord(void) DeleteFile(filename); /* Delete it for sure, when everything else is closed. */ } +static void test_MsiRecordGetString(void) +{ + MSIHANDLE rec; + CHAR buf[MAX_PATH]; + DWORD sz; + UINT r; + + rec = MsiCreateRecord(2); + ok(rec != 0, "Expected a valid handle\n"); + + sz = MAX_PATH; + lstrcpyA(buf, "apple"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); + ok(sz == 0, "Expected 0, got %d\n", sz); + + sz = MAX_PATH; + lstrcpyA(buf, "apple"); + r = MsiRecordGetString(rec, 10, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); + ok(sz == 0, "Expected 0, got %d\n", sz); + + MsiCloseHandle(rec); +} + START_TEST(record) { test_msirecord(); + test_MsiRecordGetString(); }