James Hawkins : msi: Don't try to release a NULL record, with tests ( Coverity 536).
Alexandre Julliard
julliard at winehq.org
Mon Mar 23 12:34:55 CDT 2009
Module: wine
Branch: master
Commit: fb8db0ac13ad86f7354a7df6e707ffc5b239e511
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fb8db0ac13ad86f7354a7df6e707ffc5b239e511
Author: James Hawkins <truiken at gmail.com>
Date: Sun Mar 22 14:31:24 2009 -0700
msi: Don't try to release a NULL record, with tests (Coverity 536).
---
dlls/msi/package.c | 3 +-
dlls/msi/tests/package.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 112 insertions(+), 1 deletions(-)
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 7172ff4..378ad76 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -1345,7 +1345,8 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
msiobj_release(&view->hdr);
}
- msiobj_release(&row->hdr);
+ if (row)
+ msiobj_release(&row->hdr);
if (rc == ERROR_SUCCESS && (!lstrcmpW(szName, cszSourceDir)))
msi_reset_folders(package, TRUE);
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 2696dc2..c5c3b67 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -11374,6 +11374,115 @@ static void test_MsiGetProductProperty(void)
DeleteFileA(msifile);
}
+static void test_MsiSetProperty(void)
+{
+ MSIHANDLE hpkg, hdb, hrec;
+ CHAR buf[MAX_PATH];
+ LPCSTR query;
+ DWORD size;
+ UINT r;
+
+ hpkg = package_from_db(create_package_db());
+ ok(hpkg != 0, "Expected a valid package\n");
+
+ /* invalid hInstall */
+ r = MsiSetPropertyA(0, "Prop", "Val");
+ ok(r == ERROR_INVALID_HANDLE,
+ "Expected ERROR_INVALID_HANDLE, got %d\n", r);
+
+ /* invalid hInstall */
+ r = MsiSetPropertyA(0xdeadbeef, "Prop", "Val");
+ ok(r == ERROR_INVALID_HANDLE,
+ "Expected ERROR_INVALID_HANDLE, got %d\n", r);
+
+ /* szName is NULL */
+ r = MsiSetPropertyA(hpkg, NULL, "Val");
+ ok(r == ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
+
+ /* both szName and szValue are NULL */
+ r = MsiSetPropertyA(hpkg, NULL, NULL);
+ ok(r == ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
+
+ /* szName is empty */
+ r = MsiSetPropertyA(hpkg, "", "Val");
+ ok(r == ERROR_FUNCTION_FAILED,
+ "Expected ERROR_FUNCTION_FAILED, got %d\n", r);
+
+ /* szName is empty and szValue is NULL */
+ r = MsiSetPropertyA(hpkg, "", NULL);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+ /* set a property */
+ r = MsiSetPropertyA(hpkg, "Prop", "Val");
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+ /* get the property */
+ size = MAX_PATH;
+ r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(!lstrcmpA(buf, "Val"), "Expected \"Val\", got \"%s\"\n", buf);
+ ok(size == 3, "Expected 3, got %d\n", size);
+
+ /* update the property */
+ r = MsiSetPropertyA(hpkg, "Prop", "Nuvo");
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+ /* get the property */
+ size = MAX_PATH;
+ r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(!lstrcmpA(buf, "Nuvo"), "Expected \"Nuvo\", got \"%s\"\n", buf);
+ ok(size == 4, "Expected 4, got %d\n", size);
+
+ hdb = MsiGetActiveDatabase(hpkg);
+ ok(hdb != 0, "Expected a valid database handle\n");
+
+ /* set prop is not in the _Property table */
+ query = "SELECT * FROM `_Property` WHERE `Property` = 'Prop'";
+ r = do_query(hdb, query, &hrec);
+ ok(r == ERROR_BAD_QUERY_SYNTAX,
+ "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
+
+ /* set prop is not in the Property table */
+ query = "SELECT * FROM `Property` WHERE `Property` = 'Prop'";
+ r = do_query(hdb, query, &hrec);
+ ok(r == ERROR_BAD_QUERY_SYNTAX,
+ "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
+
+ MsiCloseHandle(hdb);
+
+ /* szValue is an empty string */
+ r = MsiSetPropertyA(hpkg, "Prop", "");
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+ /* try to get the property */
+ size = MAX_PATH;
+ r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
+ ok(size == 0, "Expected 0, got %d\n", size);
+
+ /* reset the property */
+ r = MsiSetPropertyA(hpkg, "Prop", "BlueTap");
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+ /* delete the property */
+ r = MsiSetPropertyA(hpkg, "Prop", NULL);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+ /* try to get the property */
+ size = MAX_PATH;
+ r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
+ ok(size == 0, "Expected 0, got %d\n", size);
+
+ MsiCloseHandle(hpkg);
+ DeleteFileA(msifile);
+}
+
START_TEST(package)
{
GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
@@ -11406,4 +11515,5 @@ START_TEST(package)
test_access();
test_emptypackage();
test_MsiGetProductProperty();
+ test_MsiSetProperty();
}
More information about the wine-cvs
mailing list