msi: Ignore invalid upgrade codes in the PublishProduct action.

This commit is contained in:
Hans Leidekker 2011-03-30 12:29:59 +02:00 committed by Alexandre Julliard
parent 8800772f2d
commit e82a4896f3
2 changed files with 99 additions and 12 deletions

View File

@ -4364,26 +4364,21 @@ static UINT msi_publish_upgrade_code(MSIPACKAGE *package)
return ERROR_SUCCESS;
if (package->Context == MSIINSTALLCONTEXT_MACHINE)
{
r = MSIREG_OpenClassesUpgradeCodesKey(upgrade, &hkey, TRUE);
if (r != ERROR_SUCCESS)
goto done;
}
else
{
r = MSIREG_OpenUserUpgradeCodesKey(upgrade, &hkey, TRUE);
if (r != ERROR_SUCCESS)
goto done;
}
if (r != ERROR_SUCCESS)
{
WARN("failed to open upgrade code key\n");
msi_free(upgrade);
return ERROR_SUCCESS;
}
squash_guid(package->ProductCode, squashed_pc);
msi_reg_set_val_str(hkey, squashed_pc, NULL);
RegCloseKey(hkey);
done:
msi_free(upgrade);
return r;
return ERROR_SUCCESS;
}
static BOOL msi_check_publish(MSIPACKAGE *package)

View File

@ -1191,6 +1191,53 @@ static const CHAR cl_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
"InstallValidate\t\t1400\n"
"InstallFinalize\t\t5000\n";
static const CHAR uc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"upgradecode.txt\tupgradecode\tupgradecode.txt\t1000\t\t\t8192\t1\n";
static const CHAR uc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"upgradecode\t\t\tupgradecode feature\t1\t2\tMSITESTDIR\t0\n";
static const CHAR uc_feature_comp_dat[] = "Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"upgradecode\tupgradecode\n";
static const CHAR uc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"upgradecode\t{6952B732-2FCB-4E47-976F-989FCBD7EDFB}\tMSITESTDIR\t0\t\tupgradecode.txt\n";
static const CHAR uc_property_dat[] = "Property\tValue\n"
"s72\tl0\n"
"Property\tProperty\n"
"INSTALLLEVEL\t3\n"
"ProductCode\t{E5FB1241-F547-4BA7-A60E-8E75797268D4}\n"
"ProductName\tMSITEST\n"
"ProductVersion\t1.1.1\n"
"UpgradeCode\t#UPGEADECODE#\n"
"MSIFASTINSTALL\t1\n";
static const CHAR uc_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t200\n"
"FileCost\t\t300\n"
"CostFinalize\t\t400\n"
"InstallInitialize\t\t500\n"
"ProcessComponents\t\t600\n"
"InstallValidate\t\t700\n"
"RemoveFiles\t\t800\n"
"InstallFiles\t\t900\n"
"RegisterProduct\t\t1000\n"
"PublishFeatures\t\t1100\n"
"PublishProduct\t\t1200\n"
"InstallFinalize\t\t1300\n";
typedef struct _msi_table
{
const CHAR *filename;
@ -1870,6 +1917,18 @@ static const msi_table cl_tables[] =
ADD_TABLE(property)
};
static const msi_table uc_tables[] =
{
ADD_TABLE(directory),
ADD_TABLE(uc_component),
ADD_TABLE(uc_feature),
ADD_TABLE(uc_feature_comp),
ADD_TABLE(uc_file),
ADD_TABLE(uc_install_exec_seq),
ADD_TABLE(media),
ADD_TABLE(uc_property)
};
/* cabinet definitions */
/* make the max size large so there is only one cab file */
@ -6373,6 +6432,38 @@ static void test_command_line_parsing(void)
RemoveDirectory("msitest");
}
static void test_upgrade_code(void)
{
UINT r;
if (is_process_limited())
{
skip("process is limited\n");
return;
}
CreateDirectoryA("msitest", NULL);
create_file("msitest\\upgradecode.txt", 1000);
create_database(msifile, uc_tables, sizeof(uc_tables) / sizeof(msi_table));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(pf_exists("msitest\\upgradecode.txt"), "file not installed\n");
r = MsiInstallProductA(msifile, "REMOVE=ALL");
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(!delete_pf("msitest\\upgradecode.txt", TRUE), "file not removed\n");
ok(!delete_pf("msitest", FALSE), "directory not removed\n");
DeleteFileA("msitest\\upgradecode.txt");
RemoveDirectoryA("msitest");
DeleteFile(msifile);
}
START_TEST(install)
{
DWORD len;
@ -6463,6 +6554,7 @@ START_TEST(install)
test_sourcedir_props();
test_package_validation();
test_command_line_parsing();
test_upgrade_code();
DeleteFileA(log_file);