Changeset - r25103:79e816f12199
[Not reviewed]
master
0 3 0
milek7 - 3 years ago 2021-03-27 23:12:32
me@milek7.pl
Fix: Freeing LanguagePack with wrong size.
3 files changed with 13 insertions and 8 deletions:
0 comments (0 inline, 0 general)
src/fileio.cpp
Show inline comments
 
@@ -1259,7 +1259,7 @@ void SanitizeFilename(char *filename)
 
 * @return Pointer to new memory containing the loaded data, or \c nullptr if loading failed.
 
 * @note If \a maxsize less than the length of the file, loading fails.
 
 */
 
std::unique_ptr<char> ReadFileToMem(const std::string &filename, size_t &lenp, size_t maxsize)
 
std::unique_ptr<char[]> ReadFileToMem(const std::string &filename, size_t &lenp, size_t maxsize)
 
{
 
	FILE *in = fopen(filename.c_str(), "rb");
 
	if (in == nullptr) return nullptr;
 
@@ -1271,10 +1271,7 @@ std::unique_ptr<char> ReadFileToMem(cons
 
	fseek(in, 0, SEEK_SET);
 
	if (len > maxsize) return nullptr;
 

	
 
	/* std::unique_ptr assumes new/delete unless a custom deleter is supplied.
 
	 * As we don't want to have to carry that deleter all over the place, use
 
	 * new directly to allocate the memory instead of malloc. */
 
	std::unique_ptr<char> mem(static_cast<char *>(::operator new(len + 1)));
 
	std::unique_ptr<char[]> mem = std::make_unique<char[]>(len + 1);
 

	
 
	mem.get()[len] = 0;
 
	if (fread(mem.get(), len, 1, in) != 1) return nullptr;
src/fileio_func.h
Show inline comments
 
@@ -49,7 +49,7 @@ const char *FiosGetScreenshotDir();
 
void SanitizeFilename(char *filename);
 
void AppendPathSeparator(std::string &buf);
 
void DeterminePaths(const char *exe);
 
std::unique_ptr<char> ReadFileToMem(const std::string &filename, size_t &lenp, size_t maxsize);
 
std::unique_ptr<char[]> ReadFileToMem(const std::string &filename, size_t &lenp, size_t maxsize);
 
bool FileExists(const std::string &filename);
 
bool ExtractTar(const std::string &tar_filename, Subdirectory subdir);
 

	
src/strings.cpp
Show inline comments
 
@@ -185,8 +185,16 @@ struct LanguagePack : public LanguagePac
 
	char data[]; // list of strings
 
};
 

	
 
struct LanguagePackDeleter {
 
	void operator()(LanguagePack *langpack)
 
	{
 
		/* LanguagePack is in fact reinterpreted char[], we need to reinterpret it back to free it properly. */
 
		delete[] reinterpret_cast<char*>(langpack);
 
	}
 
};
 

	
 
struct LoadedLanguagePack {
 
	std::unique_ptr<LanguagePack> langpack;
 
	std::unique_ptr<LanguagePack, LanguagePackDeleter> langpack;
 

	
 
	std::vector<char *> offsets;
 

	
 
@@ -1713,7 +1721,7 @@ bool ReadLanguagePack(const LanguageMeta
 
{
 
	/* Current language pack */
 
	size_t len = 0;
 
	std::unique_ptr<LanguagePack> lang_pack(reinterpret_cast<LanguagePack *>(ReadFileToMem(lang->file, len, 1U << 20).release()));
 
	std::unique_ptr<LanguagePack, LanguagePackDeleter> lang_pack(reinterpret_cast<LanguagePack *>(ReadFileToMem(lang->file, len, 1U << 20).release()));
 
	if (!lang_pack) return false;
 

	
 
	/* End of read data (+ terminating zero added in ReadFileToMem()) */
0 comments (0 inline, 0 general)