msi: Assume a file is present if the target exists with the same size and there's no file version or hash to verify.
This commit is contained in:
parent
be790cb0ad
commit
429407cfb6
|
@ -119,12 +119,21 @@ static msi_file_state calculate_install_state( MSIFILE *file )
|
||||||
{
|
{
|
||||||
return msifs_overwrite;
|
return msifs_overwrite;
|
||||||
}
|
}
|
||||||
if (file->hash.dwFileHashInfoSize && msi_file_hash_matches( file ))
|
if (file->hash.dwFileHashInfoSize)
|
||||||
{
|
{
|
||||||
TRACE("file hashes match, not overwriting\n");
|
if (msi_file_hash_matches( file ))
|
||||||
return msifs_present;
|
{
|
||||||
|
TRACE("file hashes match, not overwriting\n");
|
||||||
|
return msifs_hashmatch;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TRACE("file hashes do not match, overwriting\n");
|
||||||
|
return msifs_overwrite;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return msifs_overwrite;
|
/* assume present */
|
||||||
|
return msifs_present;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void schedule_install_files(MSIPACKAGE *package)
|
static void schedule_install_files(MSIPACKAGE *package)
|
||||||
|
@ -299,6 +308,13 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
|
||||||
ERR("Unable to load media info for %s (%u)\n", debugstr_w(file->File), rc);
|
ERR("Unable to load media info for %s (%u)\n", debugstr_w(file->File), rc);
|
||||||
return ERROR_FUNCTION_FAILED;
|
return ERROR_FUNCTION_FAILED;
|
||||||
}
|
}
|
||||||
|
if (!file->Component->Enabled) continue;
|
||||||
|
|
||||||
|
if (file->state != msifs_hashmatch && (rc = ready_media( package, file, mi )))
|
||||||
|
{
|
||||||
|
ERR("Failed to ready media for %s\n", debugstr_w(file->File));
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
if (file->state != msifs_missing && !mi->is_continuous && file->state != msifs_overwrite)
|
if (file->state != msifs_missing && !mi->is_continuous && file->state != msifs_overwrite)
|
||||||
continue;
|
continue;
|
||||||
|
@ -308,13 +324,6 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
|
||||||
{
|
{
|
||||||
MSICABDATA data;
|
MSICABDATA data;
|
||||||
|
|
||||||
rc = ready_media(package, file, mi);
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
ERR("Failed to ready media for %s\n", debugstr_w(file->File));
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
data.mi = mi;
|
data.mi = mi;
|
||||||
data.package = package;
|
data.package = package;
|
||||||
data.cb = installfiles_cb;
|
data.cb = installfiles_cb;
|
||||||
|
|
|
@ -499,6 +499,7 @@ typedef enum _msi_file_state {
|
||||||
msifs_present,
|
msifs_present,
|
||||||
msifs_installed,
|
msifs_installed,
|
||||||
msifs_skipped,
|
msifs_skipped,
|
||||||
|
msifs_hashmatch
|
||||||
} msi_file_state;
|
} msi_file_state;
|
||||||
|
|
||||||
typedef struct tagMSIFILE
|
typedef struct tagMSIFILE
|
||||||
|
|
|
@ -713,7 +713,8 @@ static const CHAR mc_component_dat[] = "Component\tComponentId\tDirectory_\tAttr
|
||||||
"maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
|
"maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
|
||||||
"augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
|
"augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
|
||||||
"caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
|
"caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
|
||||||
"gaius\t\tMSITESTDIR\t0\tGAIUS=1\tgaius\n";
|
"gaius\t\tMSITESTDIR\t0\tGAIUS=1\tgaius\n"
|
||||||
|
"tiberius\t\tMSITESTDIR\t0\t\ttiberius\n";
|
||||||
|
|
||||||
static const CHAR mc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
|
static const CHAR mc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
|
||||||
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
|
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
|
||||||
|
@ -721,7 +722,8 @@ static const CHAR mc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion
|
||||||
"maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
|
"maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
|
||||||
"augustus\taugustus\taugustus\t500\t\t\t0\t2\n"
|
"augustus\taugustus\taugustus\t500\t\t\t0\t2\n"
|
||||||
"caesar\tcaesar\tcaesar\t500\t\t\t16384\t3\n"
|
"caesar\tcaesar\tcaesar\t500\t\t\t16384\t3\n"
|
||||||
"gaius\tgaius\tgaius\t500\t\t\t16384\t4";
|
"gaius\tgaius\tgaius\t500\t\t\t16384\t4\n"
|
||||||
|
"tiberius\ttiberius\ttiberius\t500\t\t\t0\t5\n";
|
||||||
|
|
||||||
static const CHAR mc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
|
static const CHAR mc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
|
||||||
"i2\ti4\tL64\tS255\tS32\tS72\n"
|
"i2\ti4\tL64\tS255\tS32\tS72\n"
|
||||||
|
@ -729,7 +731,8 @@ static const CHAR mc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tV
|
||||||
"1\t1\t\ttest1.cab\tDISK1\t\n"
|
"1\t1\t\ttest1.cab\tDISK1\t\n"
|
||||||
"2\t2\t\ttest2.cab\tDISK2\t\n"
|
"2\t2\t\ttest2.cab\tDISK2\t\n"
|
||||||
"3\t3\t\ttest3.cab\tDISK3\t\n"
|
"3\t3\t\ttest3.cab\tDISK3\t\n"
|
||||||
"4\t4\t\ttest3.cab\tDISK3\t\n";
|
"4\t4\t\ttest3.cab\tDISK3\t\n"
|
||||||
|
"5\t5\t\ttest4.cab\tDISK4\t\n";
|
||||||
|
|
||||||
static const CHAR mc_file_hash_dat[] = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n"
|
static const CHAR mc_file_hash_dat[] = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n"
|
||||||
"s72\ti2\ti4\ti4\ti4\ti4\n"
|
"s72\ti2\ti4\ti4\ti4\ti4\n"
|
||||||
|
@ -2295,6 +2298,29 @@ static BOOL delete_cf(const CHAR *rel_path, BOOL is_file)
|
||||||
return RemoveDirectoryA(path);
|
return RemoveDirectoryA(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL compare_pf_data(const char *filename, const char *data, DWORD size)
|
||||||
|
{
|
||||||
|
DWORD read;
|
||||||
|
HANDLE handle;
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
char *buffer, path[MAX_PATH];
|
||||||
|
|
||||||
|
lstrcpyA(path, PROG_FILES_DIR);
|
||||||
|
lstrcatA(path, "\\");
|
||||||
|
lstrcatA(path, filename);
|
||||||
|
|
||||||
|
handle = CreateFileA(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
buffer = HeapAlloc(GetProcessHeap(), 0, size);
|
||||||
|
if (buffer)
|
||||||
|
{
|
||||||
|
ReadFile(handle, buffer, size, &read, NULL);
|
||||||
|
if (read == size && !memcmp(data, buffer, size)) ret = TRUE;
|
||||||
|
HeapFree(GetProcessHeap(), 0, buffer);
|
||||||
|
}
|
||||||
|
CloseHandle(handle);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static void delete_test_files(void)
|
static void delete_test_files(void)
|
||||||
{
|
{
|
||||||
DeleteFileA("msitest.msi");
|
DeleteFileA("msitest.msi");
|
||||||
|
@ -4068,15 +4094,18 @@ static void test_missingcab(void)
|
||||||
CreateDirectoryA("msitest", NULL);
|
CreateDirectoryA("msitest", NULL);
|
||||||
create_file("msitest\\augustus", 500);
|
create_file("msitest\\augustus", 500);
|
||||||
create_file("maximus", 500);
|
create_file("maximus", 500);
|
||||||
|
create_file("tiberius", 500);
|
||||||
|
|
||||||
create_database(msifile, mc_tables, sizeof(mc_tables) / sizeof(msi_table));
|
create_database(msifile, mc_tables, sizeof(mc_tables) / sizeof(msi_table));
|
||||||
|
|
||||||
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
|
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
|
||||||
|
|
||||||
create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
|
create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
|
||||||
|
create_cab_file("test4.cab", MEDIA_SIZE, "tiberius\0");
|
||||||
|
|
||||||
create_pf("msitest", FALSE);
|
create_pf("msitest", FALSE);
|
||||||
create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
|
create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
|
||||||
|
create_pf_data("msitest\\tiberius", "abcdefgh", TRUE);
|
||||||
|
|
||||||
r = MsiInstallProductA(msifile, NULL);
|
r = MsiInstallProductA(msifile, NULL);
|
||||||
if (r == ERROR_INSTALL_PACKAGE_REJECTED)
|
if (r == ERROR_INSTALL_PACKAGE_REJECTED)
|
||||||
|
@ -4093,11 +4122,14 @@ static void test_missingcab(void)
|
||||||
ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
|
ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
|
||||||
}
|
}
|
||||||
ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
|
ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
|
||||||
|
ok(compare_pf_data("msitest\\tiberius", "abcdefgh", sizeof("abcdefgh")), "Wrong file contents\n");
|
||||||
|
ok(delete_pf("msitest\\tiberius", TRUE), "File not installed\n");
|
||||||
ok(!delete_pf("msitest\\gaius", TRUE), "File installed\n");
|
ok(!delete_pf("msitest\\gaius", TRUE), "File installed\n");
|
||||||
ok(delete_pf("msitest", FALSE), "File not installed\n");
|
ok(delete_pf("msitest", FALSE), "Directory not created\n");
|
||||||
|
|
||||||
create_pf("msitest", FALSE);
|
create_pf("msitest", FALSE);
|
||||||
create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
|
create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
|
||||||
|
create_pf_data("msitest\\tiberius", "abcdefgh", TRUE);
|
||||||
create_pf("msitest\\gaius", TRUE);
|
create_pf("msitest\\gaius", TRUE);
|
||||||
|
|
||||||
r = MsiInstallProductA(msifile, "GAIUS=1");
|
r = MsiInstallProductA(msifile, "GAIUS=1");
|
||||||
|
@ -4108,16 +4140,19 @@ static void test_missingcab(void)
|
||||||
ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
|
ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
|
||||||
}
|
}
|
||||||
ok(delete_pf("msitest\\caesar", TRUE), "File removed\n");
|
ok(delete_pf("msitest\\caesar", TRUE), "File removed\n");
|
||||||
|
ok(compare_pf_data("msitest\\tiberius", "abcdefgh", sizeof("abcdefgh")), "Wrong file contents\n");
|
||||||
|
ok(delete_pf("msitest\\tiberius", TRUE), "File removed\n");
|
||||||
ok(delete_pf("msitest\\gaius", TRUE), "File removed\n");
|
ok(delete_pf("msitest\\gaius", TRUE), "File removed\n");
|
||||||
ok(delete_pf("msitest", FALSE), "File not installed\n");
|
ok(delete_pf("msitest", FALSE), "Directory not created\n");
|
||||||
|
|
||||||
error:
|
error:
|
||||||
delete_pf("msitest\\caesar", TRUE);
|
|
||||||
delete_pf("msitest", FALSE);
|
delete_pf("msitest", FALSE);
|
||||||
DeleteFile("msitest\\augustus");
|
DeleteFile("msitest\\augustus");
|
||||||
RemoveDirectory("msitest");
|
RemoveDirectory("msitest");
|
||||||
DeleteFile("maximus");
|
DeleteFile("maximus");
|
||||||
|
DeleteFile("tiberius");
|
||||||
DeleteFile("test1.cab");
|
DeleteFile("test1.cab");
|
||||||
|
DeleteFile("test4.cab");
|
||||||
DeleteFile(msifile);
|
DeleteFile(msifile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue