Fix: Don't crash if reading a GS string file from disk produces an error.

The raw_strings vector may not include NULLs as no consumer can deal with it.
pull/88/head
Michael Lutz 6 years ago
parent 0a883afe19
commit d95c7083ea

@ -83,13 +83,12 @@ LanguageStrings::~LanguageStrings()
LanguageStrings *ReadRawLanguageStrings(const char *file) LanguageStrings *ReadRawLanguageStrings(const char *file)
{ {
LanguageStrings *ret = NULL; LanguageStrings *ret = NULL;
FILE *fh = NULL;
try { try {
size_t to_read; size_t to_read;
fh = FioFOpenFile(file, "rb", GAME_DIR, &to_read); FILE *fh = FioFOpenFile(file, "rb", GAME_DIR, &to_read);
if (fh == NULL) { if (fh == NULL) return NULL;
return NULL;
} FileCloser fhClose(fh);
const char *langname = strrchr(file, PATHSEPCHAR); const char *langname = strrchr(file, PATHSEPCHAR);
if (langname == NULL) { if (langname == NULL) {
@ -99,10 +98,7 @@ LanguageStrings *ReadRawLanguageStrings(const char *file)
} }
/* Check for invalid empty filename */ /* Check for invalid empty filename */
if (*langname == '.' || *langname == 0) { if (*langname == '.' || *langname == 0) return NULL;
fclose(fh);
return NULL;
}
ret = new LanguageStrings(langname, strchr(langname, '.')); ret = new LanguageStrings(langname, strchr(langname, '.'));
@ -124,10 +120,8 @@ LanguageStrings *ReadRawLanguageStrings(const char *file)
} }
} }
fclose(fh);
return ret; return ret;
} catch (...) { } catch (...) {
if (fh != NULL) fclose(fh);
delete ret; delete ret;
return NULL; return NULL;
} }
@ -246,7 +240,10 @@ public:
{ {
if (strcmp(filename, exclude) == 0) return true; if (strcmp(filename, exclude) == 0) return true;
gs->raw_strings.push_back(ReadRawLanguageStrings(filename)); auto ls = ReadRawLanguageStrings(filename);
if (ls == NULL) return false;
gs->raw_strings.push_back(std::move(ls));
return true; return true;
} }
}; };
@ -267,9 +264,12 @@ GameStrings *LoadTranslations()
strecpy(e, "lang" PATHSEP "english.txt", lastof(filename)); strecpy(e, "lang" PATHSEP "english.txt", lastof(filename));
if (!FioCheckFileExists(filename, GAME_DIR)) return NULL; if (!FioCheckFileExists(filename, GAME_DIR)) return NULL;
auto ls = ReadRawLanguageStrings(filename);
if (ls == NULL) return NULL;
GameStrings *gs = new GameStrings(); GameStrings *gs = new GameStrings();
try { try {
gs->raw_strings.push_back(ReadRawLanguageStrings(filename)); gs->raw_strings.push_back(std::move(ls));
/* Scan for other language files */ /* Scan for other language files */
LanguageScanner scanner(gs, filename); LanguageScanner scanner(gs, filename);

Loading…
Cancel
Save