mirror of https://github.com/OpenTTD/OpenTTD
(svn r23886) -Codechange: Allow limiting the MD5 file hash to the first x bytes of the file.
parent
02d07e68d8
commit
a9b6c5cd86
|
@ -33,7 +33,7 @@ struct MD5File {
|
||||||
uint8 hash[16]; ///< md5 sum of the file
|
uint8 hash[16]; ///< md5 sum of the file
|
||||||
const char *missing_warning; ///< warning when this file is missing
|
const char *missing_warning; ///< warning when this file is missing
|
||||||
|
|
||||||
ChecksumResult CheckMD5(Subdirectory subdir) const;
|
ChecksumResult CheckMD5(Subdirectory subdir, size_t max_size) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -129,6 +129,20 @@ struct BaseSet {
|
||||||
/* Then fall back */
|
/* Then fall back */
|
||||||
return this->description.Begin()->second;
|
return this->description.Begin()->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate and check the MD5 hash of the supplied file.
|
||||||
|
* @param file The file get the hash of.
|
||||||
|
* @param subdir The sub directory to get the files from.
|
||||||
|
* @return
|
||||||
|
* - #CR_MATCH if the MD5 hash matches
|
||||||
|
* - #CR_MISMATCH if the MD5 does not match
|
||||||
|
* - #CR_NO_FILE if the file misses
|
||||||
|
*/
|
||||||
|
static MD5File::ChecksumResult CheckMD5(const MD5File *file, Subdirectory subdir)
|
||||||
|
{
|
||||||
|
return file->CheckMD5(subdir, SIZE_MAX);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -131,7 +131,7 @@ bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const
|
||||||
file->missing_warning = strdup(item->value);
|
file->missing_warning = strdup(item->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (file->CheckMD5(BASESET_DIR)) {
|
switch (T::CheckMD5(file, BASESET_DIR)) {
|
||||||
case MD5File::CR_MATCH:
|
case MD5File::CR_MATCH:
|
||||||
this->valid_files++;
|
this->valid_files++;
|
||||||
/* FALL THROUGH */
|
/* FALL THROUGH */
|
||||||
|
|
|
@ -119,7 +119,7 @@ void CheckExternalFiles()
|
||||||
/* Not all files were loaded successfully, see which ones */
|
/* Not all files were loaded successfully, see which ones */
|
||||||
add_pos += seprintf(add_pos, last, "Trying to load graphics set '%s', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of readme.txt.\n\nThe following files are corrupted or missing:\n", used_set->name);
|
add_pos += seprintf(add_pos, last, "Trying to load graphics set '%s', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of readme.txt.\n\nThe following files are corrupted or missing:\n", used_set->name);
|
||||||
for (uint i = 0; i < GraphicsSet::NUM_FILES; i++) {
|
for (uint i = 0; i < GraphicsSet::NUM_FILES; i++) {
|
||||||
MD5File::ChecksumResult res = used_set->files[i].CheckMD5(BASESET_DIR);
|
MD5File::ChecksumResult res = GraphicsSet::CheckMD5(&used_set->files[i], BASESET_DIR);
|
||||||
if (res != MD5File::CR_MATCH) add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", used_set->files[i].filename, res == MD5File::CR_MISMATCH ? "corrupt" : "missing", used_set->files[i].missing_warning);
|
if (res != MD5File::CR_MATCH) add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", used_set->files[i].filename, res == MD5File::CR_MISMATCH ? "corrupt" : "missing", used_set->files[i].missing_warning);
|
||||||
}
|
}
|
||||||
add_pos += seprintf(add_pos, last, "\n");
|
add_pos += seprintf(add_pos, last, "\n");
|
||||||
|
@ -132,7 +132,7 @@ void CheckExternalFiles()
|
||||||
assert_compile(SoundsSet::NUM_FILES == 1);
|
assert_compile(SoundsSet::NUM_FILES == 1);
|
||||||
/* No need to loop each file, as long as there is only a single
|
/* No need to loop each file, as long as there is only a single
|
||||||
* sound file. */
|
* sound file. */
|
||||||
add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", sounds_set->files->filename, sounds_set->files->CheckMD5(BASESET_DIR) == MD5File::CR_MISMATCH ? "corrupt" : "missing", sounds_set->files->missing_warning);
|
add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", sounds_set->files->filename, SoundsSet::CheckMD5(sounds_set->files, BASESET_DIR) == MD5File::CR_MISMATCH ? "corrupt" : "missing", sounds_set->files->missing_warning);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (add_pos != error_msg) ShowInfoF("%s", error_msg);
|
if (add_pos != error_msg) ShowInfoF("%s", error_msg);
|
||||||
|
@ -266,18 +266,21 @@ bool GraphicsSet::FillSetDetails(IniFile *ini, const char *path, const char *ful
|
||||||
/**
|
/**
|
||||||
* Calculate and check the MD5 hash of the supplied filename.
|
* Calculate and check the MD5 hash of the supplied filename.
|
||||||
* @param subdir The sub directory to get the files from
|
* @param subdir The sub directory to get the files from
|
||||||
|
* @param max_size Only calculate the hash for this many bytes from the file start.
|
||||||
* @return
|
* @return
|
||||||
* - #CR_MATCH if the MD5 hash matches
|
* - #CR_MATCH if the MD5 hash matches
|
||||||
* - #CR_MISMATCH if the MD5 does not match
|
* - #CR_MISMATCH if the MD5 does not match
|
||||||
* - #CR_NO_FILE if the file misses
|
* - #CR_NO_FILE if the file misses
|
||||||
*/
|
*/
|
||||||
MD5File::ChecksumResult MD5File::CheckMD5(Subdirectory subdir) const
|
MD5File::ChecksumResult MD5File::CheckMD5(Subdirectory subdir, size_t max_size) const
|
||||||
{
|
{
|
||||||
size_t size;
|
size_t size;
|
||||||
FILE *f = FioFOpenFile(this->filename, "rb", subdir, &size);
|
FILE *f = FioFOpenFile(this->filename, "rb", subdir, &size);
|
||||||
|
|
||||||
if (f == NULL) return CR_NO_FILE;
|
if (f == NULL) return CR_NO_FILE;
|
||||||
|
|
||||||
|
size = min(size, max_size);
|
||||||
|
|
||||||
Md5 checksum;
|
Md5 checksum;
|
||||||
uint8 buffer[1024];
|
uint8 buffer[1024];
|
||||||
uint8 digest[16];
|
uint8 digest[16];
|
||||||
|
|
Loading…
Reference in New Issue