(svn r14563) -Fix [FS#2395]: in the case that an industry NewGRF, a shared TTDPatch and
authorrubidium
Mon, 03 Nov 2008 23:42:07 +0000
changeset 10318 d436fee569bf
parent 10317 a904407b644f
child 10319 987cb9dc47b4
(svn r14563) -Fix [FS#2395]: in the case that an industry NewGRF, a shared TTDPatch and
OpenTTD feature with it's origin in TTDPatch to replace/add/change vehicles
(including e.g. maximum speed, graphics and introduction year), stations,
bridges, industries, town houses or any other graphics used by either
TTDPatch or OpenTTD, would tell that building an industry is okay, which
is queried using a so-called callback that allows the NewGRF author to
test all kinds of information about the neighbourhood where the industry
might get build, it would corrupt, i.e. overwrite with invalid data, the
structure that is used to build up an error message. This then might result
in trying to resolve an invalid StringID, an internal numeric representation
of all translateable strings, which would in it's turn trigger a safety
check that is added to ensure invalid StringIDs are never resolved.
src/newgrf_industries.cpp
src/newgrf_industrytiles.cpp
--- a/src/newgrf_industries.cpp	Mon Nov 03 20:23:51 2008 +0000
+++ b/src/newgrf_industries.cpp	Mon Nov 03 23:42:07 2008 +0000
@@ -523,7 +523,7 @@
 
 	/* Unlike the "normal" cases, not having a valid result means we allow
 	 * the building of the industry, as that's how it's done in TTDP. */
-	if (group == NULL || group->type != SGT_CALLBACK) return true;
+	if (group == NULL || group->type != SGT_CALLBACK || group->g.callback.result == 0x400) return true;
 
 	/* Copy some parameters from the registers to the error message text ref. stack */
 	SwitchToErrorRefStack();
@@ -531,7 +531,6 @@
 	SwitchToNormalRefStack();
 
 	switch (group->g.callback.result) {
-		case 0x400: return true;
 		case 0x401: _error_message = STR_0239_SITE_UNSUITABLE; break;
 		case 0x402: _error_message = STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST; break;
 		case 0x403: _error_message = STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT; break;
--- a/src/newgrf_industrytiles.cpp	Mon Nov 03 20:23:51 2008 +0000
+++ b/src/newgrf_industrytiles.cpp	Mon Nov 03 23:42:07 2008 +0000
@@ -284,6 +284,7 @@
 	if (its->grf_prop.grffile->grf_version < 7) {
 		return callback_res != 0;
 	}
+	if (callback_res == 0x400) return true;
 
 	/* Copy some parameters from the registers to the error message text ref. stack */
 	SwitchToErrorRefStack();
@@ -291,7 +292,6 @@
 	SwitchToNormalRefStack();
 
 	switch (callback_res) {
-		case 0x400: return true;
 		case 0x401: _error_message = STR_0239_SITE_UNSUITABLE;                 return false;
 		case 0x402: _error_message = STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST; return false;
 		case 0x403: _error_message = STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT;     return false;