Module: wine Branch: master Commit: d4e9b2cd0f6f1d7510f1aa11ae536c87c5381492 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d4e9b2cd0f6f1d7510f1aa11ae...
Author: Hans Leidekker hans@codeweavers.com Date: Thu Jan 31 15:10:45 2013 +0100
msi: Fix the return value of MsiGetFileVersion for some corner cases.
---
dlls/msi/msi.c | 8 +++++--- dlls/msi/tests/msi.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-)
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index 5aba98d..6a623e7 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -3158,7 +3158,7 @@ static UINT get_file_version( const WCHAR *path, WCHAR *verbuf, DWORD *verlen, static const WCHAR szVersionResource[] = {'\',0}; static const WCHAR szVersionFormat[] = {'%','d','.','%','d','.','%','d','.','%','d',0}; static const WCHAR szLangFormat[] = {'%','d',0}; - UINT ret = ERROR_SUCCESS; + UINT ret = ERROR_MORE_DATA; DWORD len, error; LPVOID version; VS_FIXEDFILEINFO *ffi; @@ -3169,6 +3169,7 @@ static UINT get_file_version( const WCHAR *path, WCHAR *verbuf, DWORD *verlen, { error = GetLastError(); if (error == ERROR_BAD_PATHNAME) return ERROR_FILE_NOT_FOUND; + if (error == ERROR_RESOURCE_DATA_NOT_FOUND) return ERROR_FILE_INVALID; return error; } if (!(version = msi_alloc( len ))) return ERROR_OUTOFMEMORY; @@ -3177,6 +3178,7 @@ static UINT get_file_version( const WCHAR *path, WCHAR *verbuf, DWORD *verlen, msi_free( version ); return GetLastError(); } + if (!verbuf && !verlen && !langbuf && !langlen) return ERROR_SUCCESS; if (verlen) { if (VerQueryValueW( version, szVersionResource, (LPVOID *)&ffi, &len ) && len > 0) @@ -3186,7 +3188,7 @@ static UINT get_file_version( const WCHAR *path, WCHAR *verbuf, DWORD *verlen, HIWORD(ffi->dwFileVersionLS), LOWORD(ffi->dwFileVersionLS) ); if (verbuf) lstrcpynW( verbuf, tmp, *verlen ); len = strlenW( tmp ); - if (len >= *verlen) ret = ERROR_MORE_DATA; + if (*verlen > len) ret = ERROR_SUCCESS; *verlen = len; } else @@ -3202,7 +3204,7 @@ static UINT get_file_version( const WCHAR *path, WCHAR *verbuf, DWORD *verlen, sprintfW( tmp, szLangFormat, *lang ); if (langbuf) lstrcpynW( langbuf, tmp, *langlen ); len = strlenW( tmp ); - if (len >= *langlen) ret = ERROR_MORE_DATA; + if (*langlen > len) ret = ERROR_SUCCESS; *langlen = len; } else diff --git a/dlls/msi/tests/msi.c b/dlls/msi/tests/msi.c index da6b446..028a7dc 100644 --- a/dlls/msi/tests/msi.c +++ b/dlls/msi/tests/msi.c @@ -2829,6 +2829,9 @@ static void test_MsiGetFileVersion(void) DWORD verchecksz, langchecksz;
/* NULL szFilePath */ + r = MsiGetFileVersionA(NULL, NULL, NULL, NULL, NULL); + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + versz = MAX_PATH; langsz = MAX_PATH; lstrcpyA(version, "version"); @@ -2844,6 +2847,9 @@ static void test_MsiGetFileVersion(void) ok(langsz == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, langsz);
/* empty szFilePath */ + r = MsiGetFileVersionA("", NULL, NULL, NULL, NULL); + ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", r); + versz = MAX_PATH; langsz = MAX_PATH; lstrcpyA(version, "version"); @@ -2941,6 +2947,9 @@ static void test_MsiGetFileVersion(void) create_file("ver.txt", "ver.txt", 20);
/* file exists, no version information */ + r = MsiGetFileVersionA("ver.txt", NULL, NULL, NULL, NULL); + ok(r == ERROR_FILE_INVALID, "Expected ERROR_FILE_INVALID, got %d\n", r); + versz = MAX_PATH; langsz = MAX_PATH; lstrcpyA(version, "version"); @@ -3042,6 +3051,34 @@ static void test_MsiGetFileVersion(void) "Expected first character of %s, got %s\n", langcheck, lang); ok(langsz >= langchecksz, "Expected %d >= %d\n", langsz, langchecksz);
+ /* pcchVersionBuf big enough, pcchLangBuf not big enough */ + versz = MAX_PATH; + langsz = 0; + lstrcpyA(version, "version"); + r = MsiGetFileVersionA(path, version, &versz, NULL, &langsz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(versz == verchecksz, "Expected %d, got %d\n", verchecksz, versz); + ok(!lstrcmpA(version, vercheck), "Expected %s, got %s\n", vercheck, version); + ok(langsz >= langchecksz && langsz < MAX_PATH, "Expected %d >= %d\n", langsz, langchecksz); + + /* pcchVersionBuf not big enough, pcchLangBuf big enough */ + versz = 5; + langsz = MAX_PATH; + lstrcpyA(lang, "lang"); + r = MsiGetFileVersionA(path, NULL, &versz, lang, &langsz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(versz == verchecksz, "Expected %d, got %d\n", verchecksz, versz); + ok(langsz >= langchecksz && langsz < MAX_PATH, "Expected %d >= %d\n", langsz, langchecksz); + ok(lstrcmpA(lang, "lang"), "lang buffer not modified\n"); + + /* NULL pcchVersionBuf and pcchLangBuf */ + r = MsiGetFileVersionA(path, version, NULL, lang, NULL); + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + + /* All NULL except szFilePath */ + r = MsiGetFileVersionA(path, NULL, NULL, NULL, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + HeapFree(GetProcessHeap(), 0, vercheck); HeapFree(GetProcessHeap(), 0, langcheck); }