diff options
author | rubidium <rubidium@openttd.org> | 2008-05-06 21:07:47 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2008-05-06 21:07:47 +0000 |
commit | 46a0ebe1d931bb49dcc10e811f8f85ea91e1dcb5 (patch) | |
tree | 6a341492b6896f31cc2f5729b0b04ce807084287 | |
parent | c025d7a152a5e32f5b5148f43e962e33a7a59c09 (diff) | |
download | openttd-46a0ebe1d931bb49dcc10e811f8f85ea91e1dcb5.tar.xz |
(svn r12974) -Codechange: check whether loading/saving highscores goes as it should be.
-rw-r--r-- | src/players.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/players.cpp b/src/players.cpp index b66626caf..d72bc2b95 100644 --- a/src/players.cpp +++ b/src/players.cpp @@ -36,6 +36,7 @@ #include "road_func.h" #include "rail.h" #include "sprite.h" +#include "debug.h" #include "table/strings.h" #include "table/sprites.h" @@ -1072,12 +1073,16 @@ void SaveToHighScore() for (i = 0; i < LAST_HS_ITEM; i++) { // don't save network highscores for (hs = _highscore_table[i]; hs != endof(_highscore_table[i]); hs++) { /* First character is a command character, so strlen will fail on that */ - byte length = min(sizeof(hs->company), (hs->company[0] == '\0') ? 0 : (int)strlen(&hs->company[1]) + 1); - - fwrite(&length, sizeof(length), 1, fp); // write away string length - fwrite(hs->company, length, 1, fp); - fwrite(&hs->score, sizeof(hs->score), 1, fp); - fwrite("", 2, 1, fp); // XXX - placeholder for hs->title, not saved anymore; compatibility + byte length = min(sizeof(hs->company), StrEmpty(hs->company) ? 0 : (int)strlen(&hs->company[1]) + 1); + + if (fwrite(&length, sizeof(length), 1, fp) != 1 || // write away string length + fwrite(hs->company, length, 1, fp) > 1 || // Yes... could be 0 bytes too + fwrite(&hs->score, sizeof(hs->score), 1, fp) != 1 || + fwrite(" ", 2, 1, fp) != 1) { // XXX - placeholder for hs->title, not saved anymore; compatibility + DEBUG(misc, 1, "Could not save highscore."); + i = LAST_HS_ITEM; + break; + } } } fclose(fp); @@ -1098,11 +1103,15 @@ void LoadFromHighScore() for (i = 0; i < LAST_HS_ITEM; i++) { // don't load network highscores for (hs = _highscore_table[i]; hs != endof(_highscore_table[i]); hs++) { byte length; - fread(&length, sizeof(length), 1, fp); - - fread(hs->company, 1, length, fp); - fread(&hs->score, sizeof(hs->score), 1, fp); - fseek(fp, 2, SEEK_CUR); // XXX - placeholder for hs->title, not saved anymore; compatibility + if (fread(&length, sizeof(length), 1, fp) != 1 || + fread(hs->company, length, 1, fp) > 1 || // Yes... could be 0 bytes too + fread(&hs->score, sizeof(hs->score), 1, fp) != 1 || + fseek(fp, 2, SEEK_CUR) == -1) { // XXX - placeholder for hs->title, not saved anymore; compatibility + DEBUG(misc, 1, "Highscore corrupted"); + i = LAST_HS_ITEM; + break; + } + *lastof(hs->company) = '\0'; hs->title = EndGameGetPerformanceTitleFromValue(hs->score); } } |