James Hawkins : msi: Verify that the PID_PAGECOUNT and PID_REVNUMBER summary info properties exist .

Alexandre Julliard julliard at winehq.org
Mon Dec 17 06:41:45 CST 2007


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

Author: James Hawkins <truiken at gmail.com>
Date:   Sun Dec 16 20:24:52 2007 -0600

msi: Verify that the PID_PAGECOUNT and PID_REVNUMBER summary info properties exist.

---

 dlls/msi/package.c       |   68 +++++++++++++++++++++++++++++----------------
 dlls/msi/tests/package.c |   33 +++++-----------------
 2 files changed, 52 insertions(+), 49 deletions(-)

diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index cb6e25d..a678470 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -637,7 +637,7 @@ static UINT msi_load_summary_properties( MSIPACKAGE *package )
     UINT rc;
     MSIHANDLE suminfo;
     MSIHANDLE hdb = alloc_msihandle( &package->db->hdr );
-    INT word_count;
+    INT count;
     DWORD len;
     LPWSTR package_code;
     static const WCHAR szPackageCode[] = {
@@ -645,8 +645,9 @@ static UINT msi_load_summary_properties( MSIPACKAGE *package )
 
     if (!hdb) {
         ERR("Unable to allocate handle\n");
-        return 0;
+        return ERROR_OUTOFMEMORY;
     }
+
     rc = MsiGetSummaryInformationW( hdb, NULL, 0, &suminfo );
     MsiCloseHandle(hdb);
     if (rc != ERROR_SUCCESS)
@@ -655,35 +656,47 @@ static UINT msi_load_summary_properties( MSIPACKAGE *package )
         return rc;
     }
 
-    /* load package attributes */
-    rc = MsiSummaryInfoGetPropertyW( suminfo, PID_WORDCOUNT, NULL,
-                                     &word_count, NULL, NULL, NULL );
-    if (rc == ERROR_SUCCESS)
-        package->WordCount = word_count;
-    else
-        WARN("Unable to query word count\n");
+    rc = MsiSummaryInfoGetPropertyW( suminfo, PID_PAGECOUNT, NULL,
+                                     &count, NULL, NULL, NULL );
+    if (rc != ERROR_SUCCESS)
+    {
+        WARN("Unable to query page count: %d", rc);
+        goto done;
+    }
 
     /* load package code property */
     len = 0;
     rc = MsiSummaryInfoGetPropertyW( suminfo, PID_REVNUMBER, NULL,
                                      NULL, NULL, NULL, &len );
-    if (rc == ERROR_MORE_DATA)
+    if (rc != ERROR_MORE_DATA)
     {
-        len++;
-        package_code = msi_alloc( len * sizeof(WCHAR) );
-        rc = MsiSummaryInfoGetPropertyW( suminfo, PID_REVNUMBER, NULL,
-                                         NULL, NULL, package_code, &len );
-        if (rc == ERROR_SUCCESS)
-            MSI_SetPropertyW( package, szPackageCode, package_code );
-        else
-            WARN("Unable to query rev number, %d\n", rc);
-        msi_free( package_code );
+        WARN("Unable to query revision number: %d\n", rc);
+        rc = ERROR_FUNCTION_FAILED;
+        goto done;
+    }
+
+    len++;
+    package_code = msi_alloc( len * sizeof(WCHAR) );
+    rc = MsiSummaryInfoGetPropertyW( suminfo, PID_REVNUMBER, NULL,
+                                     NULL, NULL, package_code, &len );
+    if (rc != ERROR_SUCCESS)
+    {
+        WARN("Unable to query rev number: %d\n", rc);
+        goto done;
     }
-    else
-        WARN("Unable to query rev number, %d\n", rc);
 
+    MSI_SetPropertyW( package, szPackageCode, package_code );
+    msi_free( package_code );
+
+    /* load package attributes */
+    count = 0;
+    MsiSummaryInfoGetPropertyW( suminfo, PID_WORDCOUNT, NULL,
+                                &count, NULL, NULL, NULL );
+    package->WordCount = count;
+
+done:
     MsiCloseHandle(suminfo);
-    return ERROR_SUCCESS;
+    return rc;
 }
 
 static MSIPACKAGE *msi_alloc_package( void )
@@ -746,6 +759,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
         'P','r','o','d','u','c','t','C','o','d','e',0};
     MSIPACKAGE *package;
     WCHAR uilevel[10];
+    UINT r;
 
     TRACE("%p\n", db);
 
@@ -767,7 +781,12 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
 
         package->ProductCode = msi_dup_property( package, szProductCode );
         set_installed_prop( package );
-        msi_load_summary_properties( package );
+        r = msi_load_summary_properties( package );
+        if (r != ERROR_SUCCESS)
+        {
+            msiobj_release( &package->hdr );
+            return NULL;
+        }
 
         if (package->WordCount & MSIWORDCOUNT_ADMINISTRATIVE)
             msi_load_admin_properties( package );
@@ -906,7 +925,8 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
     {
         if (file != szPackage)
             DeleteFileW( file );
-        return ERROR_FUNCTION_FAILED;
+
+        return ERROR_INSTALL_PACKAGE_INVALID;
     }
 
     if( file != szPackage )
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 8d6125d..dc0e31e 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -2045,7 +2045,8 @@ static void test_msipackage(void)
         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
     }
 
-    MsiCloseHandle(hpack);
+    if (r == ERROR_SUCCESS)
+        MsiCloseHandle(hpack);
 
     /* nonexistent szPackagePath */
     r = MsiOpenPackage("nonexistent", &hpack);
@@ -2066,14 +2067,8 @@ static void test_msipackage(void)
     /* database exists, but is emtpy */
     sprintf(name, "#%ld", hdb);
     r = MsiOpenPackage(name, &hpack);
-    todo_wine
-    {
-        ok(r == ERROR_INSTALL_PACKAGE_INVALID,
-           "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
-    }
-
-    if (r == ERROR_SUCCESS)
-        MsiCloseHandle(hpack);
+    ok(r == ERROR_INSTALL_PACKAGE_INVALID,
+       "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
 
     query = "CREATE TABLE `Property` ( "
             "`Property` CHAR(72), `Value` CHAR(0) "
@@ -2090,14 +2085,8 @@ static void test_msipackage(void)
     /* a few key tables exist */
     sprintf(name, "#%ld", hdb);
     r = MsiOpenPackage(name, &hpack);
-    todo_wine
-    {
-        ok(r == ERROR_INSTALL_PACKAGE_INVALID,
-           "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
-    }
-
-    if (r == ERROR_SUCCESS)
-        MsiCloseHandle(hpack);
+    ok(r == ERROR_INSTALL_PACKAGE_INVALID,
+       "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
 
     MsiCloseHandle(hdb);
     DeleteFile(msifile);
@@ -2115,14 +2104,8 @@ static void test_msipackage(void)
 
     set_summary_dword(hdb, PID_PAGECOUNT, 100);
     r = MsiOpenPackage(name, &hpack);
-    todo_wine
-    {
-        ok(r == ERROR_INSTALL_PACKAGE_INVALID,
-           "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
-    }
-
-    if (r == ERROR_SUCCESS)
-        MsiCloseHandle(hpack);
+    ok(r == ERROR_INSTALL_PACKAGE_INVALID,
+       "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
 
     set_summary_str(hdb, PID_REVNUMBER, "{004757CD-5092-49c2-AD20-28E1CE0DF5F2}");
     r = MsiOpenPackage(name, &hpack);




More information about the wine-cvs mailing list