(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

pull/155/head
rubidium 15 years ago
parent 9f4f7a2892
commit d9519fdf64

@ -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 */

@ -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 */

@ -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
}

Loading…
Cancel
Save