mirror of https://github.com/OpenTTD/OpenTTD
(svn r15958) -Fix [FS#2787]: Abort production callback after 0x10000 iterations and show a messagebox blaming the newgrf. (mizipzor)
parent
5551e3d2c6
commit
3393da4810
|
@ -3171,6 +3171,7 @@ STR_BROKEN_VEHICLE_LENGTH :{WHITE}Train '{
|
||||||
|
|
||||||
STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:RAW_STRING}' provides incorrect information.
|
STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:RAW_STRING}' provides incorrect information.
|
||||||
STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Cargo/refit information for '{1:ENGINE}' differs from purchase list after construction. This might cause autorenew/-replace to fail refitting correctly.
|
STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Cargo/refit information for '{1:ENGINE}' differs from purchase list after construction. This might cause autorenew/-replace to fail refitting correctly.
|
||||||
|
STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' caused an endless loop in the production callback.
|
||||||
|
|
||||||
STR_LOADGAME_REMOVED_TRAMS :{WHITE}Game was saved in version without tram support. All trams have been removed.
|
STR_LOADGAME_REMOVED_TRAMS :{WHITE}Game was saved in version without tram support. All trams have been removed.
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include "town.h"
|
#include "town.h"
|
||||||
#include "company_base.h"
|
#include "company_base.h"
|
||||||
#include "command_func.h"
|
#include "command_func.h"
|
||||||
|
#include "gui.h"
|
||||||
|
#include "strings_func.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
|
|
||||||
|
@ -570,6 +572,18 @@ void IndustryProductionCallback(Industry *ind, int reason)
|
||||||
object.callback_param2 = reason;
|
object.callback_param2 = reason;
|
||||||
|
|
||||||
for (uint loop = 0;; loop++) {
|
for (uint loop = 0;; loop++) {
|
||||||
|
/* limit the number of calls to break infinite loops.
|
||||||
|
* 'loop' is provided as 16 bits to the newgrf, so abort when those are exceeded. */
|
||||||
|
if (loop >= 0x10000) {
|
||||||
|
/* display error message */
|
||||||
|
SetDParamStr(0, spec->grf_prop.grffile->filename);
|
||||||
|
SetDParam(1, spec->name);
|
||||||
|
ShowErrorMessage(STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK, STR_NEWGRF_BUGGY, 0, 0);
|
||||||
|
|
||||||
|
/* abort the function early, this error isn't critical and will allow the game to continue to run */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
SB(object.callback_param2, 8, 16, loop);
|
SB(object.callback_param2, 8, 16, loop);
|
||||||
const SpriteGroup *group = Resolve(spec->grf_prop.spritegroup, &object);
|
const SpriteGroup *group = Resolve(spec->grf_prop.spritegroup, &object);
|
||||||
if (group == NULL || group->type != SGT_INDUSTRY_PRODUCTION) break;
|
if (group == NULL || group->type != SGT_INDUSTRY_PRODUCTION) break;
|
||||||
|
|
Loading…
Reference in New Issue