mirror of https://github.com/OpenTTD/OpenTTD
(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
parent
1858fef92f
commit
55c0109ee0
|
@ -85,5 +85,7 @@ void CDECL NetworkAddChatMessage(TextColour colour, uint8 duration, const char *
|
||||||
void NetworkUndrawChatMessage();
|
void NetworkUndrawChatMessage();
|
||||||
void NetworkChatMessageDailyLoop();
|
void NetworkChatMessageDailyLoop();
|
||||||
|
|
||||||
|
void NetworkAfterNewGRFScan();
|
||||||
|
|
||||||
#endif /* ENABLE_NETWORK */
|
#endif /* ENABLE_NETWORK */
|
||||||
#endif /* NETWORK_FUNC_H */
|
#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 */
|
#endif /* ENABLE_NETWORK */
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "string_func.h"
|
#include "string_func.h"
|
||||||
#include "gamelog.h"
|
#include "gamelog.h"
|
||||||
#include "network/network_type.h"
|
#include "network/network_type.h"
|
||||||
|
#include "network/network_func.h"
|
||||||
#include "gfx_func.h"
|
#include "gfx_func.h"
|
||||||
|
|
||||||
#include "fileio_func.h"
|
#include "fileio_func.h"
|
||||||
|
@ -391,6 +392,10 @@ void ScanNewGRFFiles()
|
||||||
_all_grfs = to_sort[0];
|
_all_grfs = to_sort[0];
|
||||||
|
|
||||||
free(to_sort);
|
free(to_sort);
|
||||||
|
|
||||||
|
#ifdef ENABLE_NETWORK
|
||||||
|
NetworkAfterNewGRFScan();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue