From d9519fdf64340e559cab586da69b92f6eacd782b Mon Sep 17 00:00:00 2001 From: rubidium Date: Thu, 17 Sep 2009 21:14:16 +0000 Subject: [PATCH] (svn r17562) -Fix [FS#2972]: the NewGRF settings of (remote) network games did not get properly updated when the NewGRFs were rescanned causing reading of freed data --- src/network/network_func.h | 2 ++ src/network/network_gamelist.cpp | 33 ++++++++++++++++++++++++++++++++ src/newgrf_config.cpp | 5 +++++ 3 files changed, 40 insertions(+) diff --git a/src/network/network_func.h b/src/network/network_func.h index a028d5bc28..2a3d368828 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -85,5 +85,7 @@ void CDECL NetworkAddChatMessage(TextColour colour, uint8 duration, const char * void NetworkUndrawChatMessage(); void NetworkChatMessageDailyLoop(); +void NetworkAfterNewGRFScan(); + #endif /* ENABLE_NETWORK */ #endif /* NETWORK_FUNC_H */ diff --git a/src/network/network_gamelist.cpp b/src/network/network_gamelist.cpp index b751fba343..5ac4ad1dfb 100644 --- a/src/network/network_gamelist.cpp +++ b/src/network/network_gamelist.cpp @@ -161,4 +161,37 @@ void NetworkGameListRequery() } } +/** + * Rebuild the GRFConfig's of the servers in the game list as we did + * a rescan and might have found new NewGRFs. + */ +void NetworkAfterNewGRFScan() +{ + for (NetworkGameList *item = _network_game_list; item != NULL; item = item->next) { + /* Reset compatability state */ + item->info.compatible = item->info.version_compatible; + + for (GRFConfig *c = item->info.grfconfig; c != NULL; c = c->next) { + assert(HasBit(c->flags, GCF_COPY)); + + const GRFConfig *f = FindGRFConfig(c->grfid, c->md5sum); + if (f == NULL) { + /* Don't know the GRF, so mark game incompatible and the (possibly) + * already resolved name for this GRF (another server has sent the + * name of the GRF already */ + c->name = FindUnknownGRFName(c->grfid, c->md5sum, true); + c->status = GCS_NOT_FOUND; + + /* If we miss a file, we're obviously incompatible */ + item->info.compatible = false; + } else { + c->filename = f->filename; + c->name = f->name; + c->info = f->info; + c->status = GCS_UNKNOWN; + } + } + } +} + #endif /* ENABLE_NETWORK */ diff --git a/src/newgrf_config.cpp b/src/newgrf_config.cpp index 07c2e432be..aff7ac4066 100644 --- a/src/newgrf_config.cpp +++ b/src/newgrf_config.cpp @@ -17,6 +17,7 @@ #include "string_func.h" #include "gamelog.h" #include "network/network_type.h" +#include "network/network_func.h" #include "gfx_func.h" #include "fileio_func.h" @@ -391,6 +392,10 @@ void ScanNewGRFFiles() _all_grfs = to_sort[0]; free(to_sort); + +#ifdef ENABLE_NETWORK + NetworkAfterNewGRFScan(); +#endif }