Hans Leidekker : msi: Fix the return value of MsiGetFileVersion for some corner cases.

Alexandre Julliard julliard at winehq.org
Thu Jan 31 12:11:42 CST 2013


Module: wine
Branch: master
Commit: d4e9b2cd0f6f1d7510f1aa11ae536c87c5381492
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d4e9b2cd0f6f1d7510f1aa11ae536c87c5381492

Author: Hans Leidekker <hans at 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);
 }




More information about the wine-cvs mailing list